Annotation de classe @after_write
-
Événement déclenché après l’écriture d’un objet de la classe.
/** * @after_write [callable] */ class A_Name
Cette annotation indique à l’objet lien de données qu’il devra appeler la méthode indiquée après chaque écriture d’un objet de la classe.
Cette méthode peut être dans la même classe, ou dans une classe tierce.
- Si la méthode est dans la même classe, elle est appelée dans le contexte de l’objet qui vient d’être écrit par le lien de données.
Le lien de données et les options qui ont été utilisées pour l’écriture sont envoyées comme paramètres à la méthode.
- Si la méthode est dans une classe tierce, il doit s’agir d’une méthode statique dont le premier paramètre sera l’objet qui vient d’être écrit, et les paramètres suivants le lien de données puis un tableau d’options qui ont été utilisées pour l’écriture.
- La méthode doit être publique, bien qu’elle ne soit pas conçue pour être appelée autrement que par le contrôleur d’appel qui exploite@after_write
.
- Convention PhpStorm : pour éviter l’alerte d’inspection unused element, utilisez l’annotation@noinspection PhpUnused @after_write
Exemples
Exemple dans la même classe
Dans l’exemple ci-dessous, la méthode appelée est dans la même classe.
Un texte apparaîtra après chaque enregistrement d’un objet de classeCar
, à remplacer par tout traitement de votre choix.namespace ITRocks\Examples\After_Write; use ITRocks\Framework\Dao\Data_Link; use ITRocks\Framework\Dao\Option; /** * A car business object example * * @after_write afterWriteCar */ class Car { /** * @var string */ public $color; /** * @noinspection PhpUnused @after_write * @param $link Data_Link * @param $options Option[] */ public function afterWriteCar(Data_Link $link, array $options) { // Do what you have to do after each write of a car here echo 'Doing things inside Car' . BR; } /** * @return string */ public function __toString() : string { return $this->color . SP . 'car'; } }
Exemple dans une classe tierce
Dans cet autre exemple, la méthode appelée est dans une autre classe, et obligatoirement statique.
La classe métier :
namespace ITRocks\Examples\After_Write; use ITRocks\Examples\After_Write\After_Write_Class; /** * A car business object example * * @after_write After_Write_Class::afterWriteCar */ class Car { /** * @var string */ public $color; }
La méthode est appelée de manière statique dans la classe tierce
After_Write_Class
:namespace ITRocks\Examples\After_Write; use ITRocks\Framework\Dao\Data_Link; use ITRocks\Framework\Dao\Option; /** * This class stores things done after writes calls */ class After_Write_Class { /** * @noinspection PhpUnused Car::@after_write * @param $car Car * @param $link Data_Link * @param $options Option[] */ public static function afterWriteCar(Car $car, Data_Link $link, array $options) { // Do what you have to do after each write of a car here echo 'Doing things outside Car' . BR; } }
Ecriture compacte
Si aucun nom de méthode n’est indiqué, la méthode appelée sera
afterWrite()
de la classe.
Exemple de classe métier :namespace ITRocks\Examples\After_Write; /** * A simple car business class example * * @after_write */ class Car { /** * @var string */ public $color; /** * This will be called by the Dao after each write of a Car object * * @noinspection PhpUnused @after_write */ public function afterWrite() { // Do what you have to do after each write of a car here echo 'Doing things inside Car' . BR; } /** * @return string */ public function __toString() : string { return $this->color . SP . 'car'; } }
Appels multiples
On peut appeler plusieurs traitements, en répétant simplement l’annotation dans la classe métier.
Ici par exemple on va appeler les deux méthodes : celle dans la classe métier, et celle de la classe tierce, des précédents exemples :// (...) /** * A car business object example * * @after_write afterWriteCar * @after_write After_Write_Class::afterWriteCar */ class Car // (...)
Les traitements des deux méthodes étant appelés, les deux textes vont s’afficher dans l’ordre :
Doing things inside Car Doing things outside Car
Interruption de la chaîne d’appels
Dans le cas d’appels multiples, la méthode appelée peut décider d’interrompre la chaîne d’appels.
C’est la valeur de retour de la méthode appelée qui détermine si l’exécution se poursuit :
-false
: l’exécution est interrompue
- toute autre valeur (y comprisnull
ou toute valeur vide autre quefalse
) : l’exécution se poursuitExemple : on réécrit la méthode
afterWriteCar
de la classe métierCar
, qui sera la première exécutée dans notre exemple précédent :/** * @param $link Data_Link * @param $options Option[] * @return boolean */ public function afterWriteCar(Data_Link $link, array $options) : bool { // Do what you have to do after each write of a car here echo 'Doing things inside Car only' . BR; return false; }
Seul le traitement de cette méthode sera appelé, le seul texte affiché sera donc :
Doing things inside Car only
Voir aussi
- Utiliser les événements du framework
- @after_commit – Événement déclenché après le commit de transaction
- @after_create – Événement déclenché après l’écriture d’un nouvel objet
- @after_delete – Événement déclenché après la suppression d’un objet
- @after_read – Événement déclenché après la lecture d’un objet
- @after_update – Événement déclenché après l’écriture de mise à jour d’un objet déjà enregistré
- @before_write – Événement déclenché avant l’écriture d’un objet