Si vous demandez, "Qu'est-ce que Yii?" Découvrez mon tutoriel précédent: Introduction au framework Yii, qui passe en revue les avantages de Yii et inclut un aperçu des nouveautés de Yii 2.0, publiées en octobre 2014.
Dans cette série de programmation avec Yii2, je guide les lecteurs dans l'utilisation du framework Yii2 pour PHP récemment mis à jour. Dans ce didacticiel, nous explorerons les comportements d'horodatage, qui réduisent la quantité de code que vous devez écrire avec chaque nouveau modèle pour l'opération courante de création d'horodatages pour les insertions et les mises à jour. Nous allons également plonger dans le code source Yii2, en examinant comment un comportement est implémenté.
Pour les exemples de ce didacticiel, nous allons continuer à imaginer que nous construisons un cadre pour la publication de mises à jour de statut simples, par exemple. notre propre mini-Twitter.
Juste un rappel, je participe aux commentaires ci-dessous. Je suis particulièrement intéressé si vous avez des approches différentes, des idées supplémentaires ou si vous souhaitez suggérer des sujets pour de futurs tutoriels..
Yii2 Les comportements sont essentiellement des mixins. Wikipedia décrit les mixins comme "une classe contenant une combinaison de méthodes d'autres classes. La manière dont cette combinaison est réalisée dépend de la langue, mais ce n'est pas un héritage."
Yii les décrit ainsi:
La liaison d'un comportement à un composant "injecte" les méthodes et propriétés du comportement dans le composant, rendant ces méthodes et propriétés accessibles comme si elles avaient été définies dans la classe de composant elle-même..
Yii2 offre plusieurs comportements intégrés, que nous allons documenter pour la plupart, notamment sluggable, blameable et timestamp. Les comportements constituent un moyen simple de réutiliser du code commun dans bon nombre de vos modèles de données sans avoir à répéter le code à plusieurs endroits. L'injection d'un comportement dans un modèle peut souvent être réalisée avec seulement deux lignes de code. À mesure que le nombre de modèles dans votre application augmente, les comportements deviennent de plus en plus utiles..
Le comportement de l'horodatage facilite la mise en œuvre de la tâche fréquemment nécessaire consistant à affecter la date et l'heure actuelles aux insertions et aux mises à jour dans un modèle ActiveRecord, en définissant automatiquement les propriétés pour créé à
et updated_at
.
Plus tôt dans cette série, nous avons implémenté le comportement d’horodatage manuellement. Chaque fois que des modèles Status étaient publiés par l'utilisateur soumettant un formulaire, nous avons affecté l'horodatage Unix actuel aux deux champs:
fonction publique actionCreate () $ model = new Status (); if ($ model-> load (Yii :: $ app-> request-> post ())) $ model-> created_at = time (); $ model-> updated_at = time (); if ($ model-> save ()) return $ this-> redirect (['view', 'id' => $ model-> id]); else var_dump ($ model-> getErrors ()); mourir();
L'implémentation du comportement d'horodatage le fera automatiquement pour nous et pourra facilement être ajouté à tous les modèles ActiveRecord d'une application Web..
Presque tous les modèles que je crée dans Yii ont un créé à
et updated_at
champ. C'est une bonne pratique. Ainsi, le comportement d'horodatage est utile dans presque tous les modèles.
Dans modèles / Status.php
nous ajoutons le TimestampBehavior
après Sluggable
et Blâmable
:
fonction publique comportements () return [['class' => SluggableBehavior :: className (), 'attribut' => 'message', 'immuable' => vrai, 'EnsureUnique' => vrai,], ['classe' => BlameableBehavior :: className (), 'createdByAttribute' => 'created_by', 'updatedByAttribute' => 'updated_by',], 'timestamp' => '' class '=>' yii \ behavior # TimestampBehavior ',' attributs '=> [ActiveRecord :: EVENT_BEFORE_INSERT => [' created_at ',' updated_at '], ActiveRecord :: EVENT_BEFORE_UPDATE => [' updated_at '],],],];
Nous devons également inclure la classe ActiveRecord au sommet de notre modèle (j'oublie toujours cette partie):
Ensuite, nous supprimons la règle requise pour
créé à
etupdated_at
dans les règles modèles:règles de fonction publique () return [[['message', 'created_at', 'updated_at'], 'required'], [['' message '],' string '], [[' permissions ',' created_at ', 'updated_at', 'created_by'], 'integer']];Comme ça:
règles de fonction publique () return [[['' message '],' requis '], [[' 'message'], 'chaîne'], [['autorisations', 'created_at', 'updated_at', 'created_by'] , 'entier']];Cela permet à la validation de réussir et de continuer avec les comportements.
Nous devons également supprimer le StatusController
créé à
etupdated_at
affectations dans l'action create:fonction publique actionCreate () $ model = new Status (); if ($ model-> load (Yii :: $ app-> request-> post ())) if ($ model-> save ()) return $ this-> redirect (['view', 'id' => $ model-> id]); else var_dump ($ model-> getErrors ()); mourir(); return $ this-> render ('create', ['model' => $ model,]);Une fois que tous ces changements sont terminés, nous pouvons écrire un nouvel article de statut:
Et, la vue résultante montre la
créé à
etupdated_at
paramètres définis par le comportement d'horodatage.La méthode tactile
Le comportement Horodatage fournit également une méthode nommée
toucher()
qui vous permet d'affecter l'horodatage actuel aux attributs spécifiés et de les enregistrer dans la base de données.$ model-> touch ('updated_at');Par exemple, si vous avez un travail cron en arrière-plan qui effectue un traitement sur la table d’état, vous pouvez avoir un
last_processed_at
horodatage auquel vous attachez le comportement. Chaque fois que le travail cron est exécuté, vous devez toucher ce champ:$ model-> touch ('last_processed_at');Le code source du comportement d'horodatage
Étant donné que Yii2 prend désormais en charge les conventions de dénomination du PSR-4, il est plus facile de plonger directement dans le code de structure pour voir comment il fonctionne. Jetons un coup d'oeil au
TimestampBehavior
code pour comprendre comment il est mis en œuvre.Le code est lié à GitHub à partir de la page de documentation:
class TimestampBehavior étend AttributeBehavior / ** * chaîne @var l'attribut qui recevra la valeur d'horodatage * Définissez cette propriété sur false si vous ne souhaitez pas enregistrer l'heure de création. * / public $ createdAtAttribute = 'created_at'; / ** * @var string l'attribut qui recevra la valeur d'horodatage. * Définissez cette propriété sur false si vous ne souhaitez pas enregistrer l'heure de mise à jour. * / public $ updatedAtAttribute = 'updated_at'; / ** * @var callable | Expression Expression utilisée pour générer l'horodatage. * Il peut s'agir d'une fonction anonyme qui renvoie la valeur d'horodatage, * ou d'un objet [[Expression]] représentant une expression de base de données (par exemple, 'new Expression (' NOW () ')'). * S'il n'est pas défini, il utilisera la valeur 'time ()' pour définir les attributs. * / public $ value; / ** * @inheritdoc * / fonction publique init () parent :: init (); if (vide ($ this-> attributs)) $ this-> attributs = [BaseActiveRecord :: EVENT_BEFORE_INSERT => [$ this-> createdAtAttribute, $ this-> updatedAtAttribute], BaseActiveRecord :: EVENT_BEFORE_UPDATE => $ this-> updatedAtribut ,]; / ** * @inheritdoc * / protected function getValue ($ event) if ($ this-> instance de valeur of Expression) return $ this-> valeur; else return $ this-> value! == null? call_user_func ($ this-> valeur, $ event): time (); / ** * Met à jour un attribut d'horodatage avec l'horodatage actuel. * * "php * $ model-> touch ('lastVisit'); *" * @param string $ attribue le nom de l'attribut à mettre à jour. * / fonction publique touch ($ attribut) $ this-> propriétaire-> updateAttributes (array_fill_keys ((array) attribut $, $ this-> getValue (null)));Les attributs par défaut sont définis ici et peuvent être personnalisés dans nos modèles:
public $ createdAtAttribute = 'created_at'; public $ updatedAtAttribute = 'updated_at';Lors de l'initialisation, le comportement définit les événements qui déclenchent les mises à jour d'horodatage des attributs spécifiés:
fonction publique init () parent :: init (); if (vide ($ this-> attributs)) $ this-> attributs = [BaseActiveRecord :: EVENT_BEFORE_INSERT => [$ this-> createdAtAttribute, $ this-> updatedAtAttribute], BaseActiveRecord :: EVENT_BEFORE_UPDATE => $ this-> updatedAtribut ,];Vous pouvez en savoir plus sur les événements Yii2 ActiveRecord ici.
le
getValue
La méthode retourne l'horodatage actuel de l'attribut s'il n'est pas défini:fonction protégée getValue ($ event) if ($ this-> valeur instance of Expression) return $ this-> valeur; else return $ this-> value! == null? call_user_func ($ this-> valeur, $ event): time ();Par défaut,
TimestampBehavior
va remplir lecréé à
etupdated_at
Attributs avec l’horodatage actuel lors de l’insertion de l’objet associé. Il va remplir leupdated_at
attribut avec l'horodatage lors de la mise à jour de l'objet. S'il n'y a pas de fonction personnalisée assignée, alors il utilise PHPtemps()
fonction, qui retourne l'horodatage Unix actuel.Il met également en œuvre le
toucher
méthode pour les attributs définis:/ ** * Met à jour un attribut d'horodatage avec l'horodatage actuel. * * "php * $ model-> touch ('lastVisit'); *" * @param string $ attribue le nom de l'attribut à mettre à jour. * / fonction publique touch ($ attribut) $ this-> propriétaire-> updateAttributes (array_fill_keys ((array) attribut $, $ this-> getValue (null)));J'espère que cela vous donne une idée de la façon de mettre en œuvre votre propre comportement de modèle. Si vous créez quelque chose de nouveau, postez un lien vers le code dans les commentaires pour que les autres puissent y accéder..
Et après?
J'espère que vous avez apprécié l'apprentissage des comportements de l'horodatage Yii2 et l'exploration du code source Yii2.
Surveillez les prochains tutoriels de ma série Programming With Yii2 pendant que je continue à plonger dans différents aspects du cadre. Vous pouvez également consulter ma série Construire votre démarrage avec PHP, qui utilise le modèle avancé de Yii2 pour créer une application du monde réel..
Je me félicite des demandes de fonctionnalités et de sujets. Vous pouvez les poster dans les commentaires ci-dessous ou m'envoyer un email sur mon site Lookahead Consulting.
Si vous souhaitez savoir quand le prochain tutoriel Yii2 arrive, suivez-moi @reifman sur Twitter ou consultez ma page d'instructeur. Ma page d’instructeur comprendra tous les articles de cette série dès leur publication..
Liens connexes