Maison  >  Article  >  cadre php  >  ThinkPHP : le deuxième des trois outils puissants pour les modèles (modificateur)

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

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼avant
2019-12-16 17:01:072637parcourir

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;
}

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);
}

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;
}

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

$this->age = $age;

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);
}

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 = 'think';
$user->save();

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('password', md5('think'));
$user->save();

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 = ['password'];

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('think');
});

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('password', md5('think'));
});

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;
}

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

protected $type = [
    'score'    =>    'float',
];

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer