Vocabulaire de l'AOP par l'exemple
-
Classe d’origine
Prenons une classe
Sender
dont la méthodesend()
permet d’envoyer un @Email .
Cette méthode ne s’occupe pas de stocker les emails en base, ni aucun traitement d’ailleurs autre que l’envoi des mails.Ce code est volontairement résumé et comporte les définitions en terminologies AOP de chacun de ses composants.
class Sender { // Plusieurs points de jonctions (joinpoints) possibles pour chaque méthode : avant, après, ou autour de public function send(Email $email) { soSomeStuffToSendEmail($email); } }
Point de coupe et aspect
Pour rajouter par la suite la notion d’archivage des emails juste après leur envoi (ou tentative d’envoi), sans toucher à l’existant (
Sender::send()
), on peut déclarer une classe pluginArchive
qui permet, par le biais de l’AOP, de déclarer une méthodearchive()
qui se chargera de la sauvegarde du mail, et reliera l’appel àarchive()
après chaque appel àSender::send()
, en procédant comme ci-dessous.class Archive implements Registerable { // Cette méthode est le greffon (advice) : le comportement ajouté public function archive(Email $email) { Dao::write($email); } public function register(Register $register) { // cette ligne de code constitue l'aspet (aspect) : la définition reliant un greffon à son point de jonction $register->aop->afterMethod( [Sender::class, 'send'], [$this, 'archive'] ); } }
Tissage de l’aspect
On peut observer dans le dossier cache/compiled/Sender le résultat du tissage de l’aspect, c’est à dire la classe
Sender
recompilée pour implémenter le nouveau comportement. C’est cette classe qui sera utilisée à la place duSender
d’origine par PHP pendant l’exécution :class Sender { // Plusieurs points de jonctions (joinpoints) possibles pour chaque méthode : avant, après, ou autour de /* public */ private function send_(Email $email) { soSomeStuffToSendEmail($email); } //#################################################################################################### AOP public function send(Email $email) { $this->send_($email); // Ici le point de coupe : le code généré par le compilateur AOP qui constitue le tissage de l'aspect /** @var $object_ Archive */ $object_ = \ITRocks\Framework\Session::current()->plugins->get(Archive::class); if ($object_) $object_->save($email); } }
Voir aussi