Comment programmer avec Yii2 comportement d'horodatage

Ce que vous allez créer

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..

Qu'est-ce qu'un comportement?

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..

Quel est le comportement de l'horodatage?

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..

Implémentation du comportement d'horodatage dans le modèle d'état

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.

Ajout du comportement d'horodatage au modèle d'état

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éé à et updated_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éé à et updated_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éé à et updated_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 le créé à et updated_at Attributs avec l’horodatage actuel lors de l’insertion de l’objet associé. Il va remplir le updated_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 PHP temps() 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

  • Le guide définitif Yii2: comportements
  • Yii2 Documentation: Comportement d'horodatage
  • Yii2 Developer Exchange, mon site de ressources Yii2