Maison > cadre php > PensezPHP > le corps du texte

ThinkPHP : le deuxième des trois outils puissants pour les modèles (modificateur)

爱喝马黛茶的安东尼
Libérer: 2019-12-16 17:01:07
avant
2666 Les gens l'ont consulté

ThinkPHP : le deuxième des trois outils puissants pour les modèles (modificateur)

Le modificateur est l'un des trois "outils" les plus puissants du modèle. Dans cet article, nous résumerons l'utilisation du modificateur et quelques précautions.

Définir le modificateur

La fonction du modificateur est d'effectuer certains traitements de données nécessaires avant que les données de l'objet du modèle ne soient écrites dans la base de données. La définition standard du modificateur est. comme suit :

public function setFieldNameAttr($value, $data)
{
    // 对value值进行处理 data参数是当前全部数据
    // 返回值就是实际要写入数据库的值
    return $value;
}
Copier après la connexion

FieldName correspond au champ field_name de la table de données (faites attention aux spécifications des champs de la table de données et aux spécifications de définition de la méthode du modificateur, sinon cela provoquera des erreurs).

En principe, chaque modificateur ne doit traiter que les données du champ correspondant, mais il est autorisé à traiter plusieurs champs en même temps si nécessaire.

Ce qui suit est un exemple

public function setBirthdayAttr($value, $data)
{
    // 格式化生日数据
    $birthday = strtotime($value);
    // 根据生日判断年龄
    $age = getAgeByBirthday($birthday);
    // 赋值年龄数据
    $this->setAttr('age', $age);
    return $birthday;
}
public function setAgeAttr($value,$data)
{
    return floor($value);
}
Copier après la connexion

La raison pour laquelle la méthode setAttr est utilisée est de garantir que l'opération d'attribution d'âge peut toujours passer par un modificateur distinct. Si vous n'avez pas de modificateurs supplémentaires, vous pouvez également l'écrire comme

public function setBirthdayAttr($value, $data)
{
    // 格式化生日数据
    $birthday = strtotime($value);
    // 根据生日判断年龄
    $age = getAgeByBirthday($birthday);
    // 赋值年龄数据
    $this->data['age'] = $age;
    return $birthday;
}
Copier après la connexion

Notez qu'il ne doit pas être écrit comme

$this->age = $age;
Copier après la connexion

car l'attribution d'objets de données à l'intérieur du modèle entraînera des inexactitudes dues à. confusion avec les attributs internes du modèle, conséquences prévues.

Si vous pouvez modifier d'autres champs dans un certain modificateur, n'oubliez pas que le modificateur de champ que vous devez modifier en plus doit avoir été attribué (ou que le modificateur a été déclenché).

Comment appeler

La méthode du modificateur n'a pas besoin d'être appelée manuellement. Une fois définie selon la spécification de définition, le système l'appellera automatiquement sous le. circonstances suivantes :

·Affectation d'un objet modèle ;

·Appeler la méthode de données de le modèle, et le deuxième paramètre est passé en vrai

·Appelez la méthode de sauvegarde du modèle et transmettez les données du tableau

<🎜 ; >

·Appelle explicitement la méthode setAttr du modèle

· définit la complétion automatique de ce champ ;

Par exemple, le modèle User définit la méthode de périphérique de modification setPasswordAttr.

public function setPasswordAttr($value, $data)
{
    return md5($value);
}
Copier après la connexion

Lorsqu'il est utilisé comme suit, la valeur du champ de mot de passe enregistré dans la base de données deviendra la valeur après md5 (« penser »).

$user = User::get(1);
$user->password = &#39;think&#39;;
$user->save();
Copier après la connexion

Si vous ne souhaitez pas utiliser de modificateurs mais souhaitez contrôler manuellement les données dans certains cas, vous pouvez essayer la méthode suivante.

$user = User::get(1);
$user->data(&#39;password&#39;, md5(&#39;think&#39;));
$user->save();
Copier après la connexion

Il ne sera pas traité par le modificateur pour le moment.

Éviter les conflits

De nombreux développeurs aiment définir la saisie semi-automatique (y compris l'insertion et la mise à jour) pour les modificateurs.

protected $auto = [&#39;password&#39;];
Copier après la connexion

C'est une erreur apparemment intelligente mais très fatale avant la V5.1.27. Essayez de l'éviter car selon les conditions de déclenchement du modificateur que nous avons données précédemment, cela entraînera l'exécution du modificateur deux fois. Ce sera une erreur catastrophique et empêchera tous les utilisateurs de se connecter normalement après l’enregistrement.

La solution est d'annuler le paramètre de complétion automatique du champ mot de passe, car le modificateur sera automatiquement déclenché à chaque fois qu'une valeur est attribuée. S'il n'y a pas d'affectation, cela signifie que le mot de passe n'a pas été modifié, et il n'y a pas d'achèvement automatique.

Les champs de saisie semi-automatique sont généralement des champs qui ne figurent pas dans le formulaire, et sont généralement des champs qui sont automatiquement traités par le système.

La version V5.1.27 a amélioré ce problème. Tous les modificateurs ne peuvent être exécutés qu'une seule fois, et le problème ci-dessus n'existe plus. Mais cela semble avoir apporté un nouveau problème. Plusieurs fois, vous souhaiterez peut-être modifier les données en cas de modèle.

User::beforeUpdate(function($user) {
    $user->password = md5(&#39;think&#39;);
});
Copier après la connexion

constatera que dans l'événement model beforeUpdate, la valeur des données ne peut pas être modifiée. La raison en est que le modificateur du modèle a été exécuté lors de la première affectation et a été exécuté lors de la deuxième affectation. (ne sera plus exécuté).

La solution est d'utiliser la méthode data comme je l'ai mentionné précédemment sans appeler le modificateur pour l'affectation des données.

User::beforeUpdate(function($user) {
    $user->data(&#39;password&#39;, md5(&#39;think&#39;));
});
Copier après la connexion

Bien sûr, une meilleure suggestion est de planifier le mécanisme de traitement des données des modificateurs, de la saisie semi-automatique et des événements de modèle. N'utilisez pas plusieurs mécanismes pour modifier les données en même temps pour un champ et les données écrites. à la base de données doit et uniquement être modifié. L'opération de modification des données est effectuée via cette méthode.

Conversion de type automatique

Si votre modificateur effectue uniquement une conversion de type sur les données, vous n'avez pas besoin de définir un modificateur, mais définissez simplement le type de champ directement.

public function setScoreAttr($value, $data)
{
    return (float) $score;
}
Copier après la connexion

La méthode de modificateur ci-dessus peut être directement modifiée en

protected $type = [
    &#39;score&#39;    =>    &#39;float&#39;,
];
Copier après la connexion
Si vous définissez un modificateur et un type pour un champ en même temps, le modificateur est prioritaire.

Les définitions de types peuvent non seulement définir des types de données simples, mais ont également des utilisations supplémentaires : par exemple : le type json, le type de tableau et le type d'objet seront sérialisés JSON, et le type de sérialisation sérialisera les données.

Le site Web PHP chinois propose un grand nombre de

tutoriels d'introduction ThinkPHP gratuits, tout le monde est invité à apprendre !

Cet article est reproduit à partir de : https://blog.thinkphp.cn/817548

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:thinkphp.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!