Utilisation des events et des observers

Un observer est une classe qui va exécuter une fonction lorsqu'un event est déclenché.

Un event est déclenché via la fonction dispatch() de la classe Magento\Framework\EntityManager\EventManager

Syntaxe de déclaration d'un observer

Les observers sont déclarés dans le fichier events.xml de notre module. Il est possible de mettre ce fichier dans le dossier :

  • etc : les events de l'admin et du front correspondants seront pris en compte
  • etc/frontend : seuls les events du front correspondants seront pris en compte
  • etc/adminhtml : seuls les events de l'admin correspondants seront pris en compte

La documentation offcielle décrit pas à pas comment créer un observer.

TP - À chaque login d'un client, changer son nom aléatoirement.

Trouver le nom de l'event

Il y a plusieurs méthodes pour trouver le nom d'un event :

  • Aller dans le code à l'endroit où vous voulez intervenir et regarder s'il y a un appel à la fonction dispatch()
  • Trouver la liste de tous les events Magento 2 et chercher celui qui pourrait correspondre
  • Faire un log dans la fonction dispatch() de la classe Magento\Framework\EntityManager\EventManager et regarder celui qui pourrait correspondre

Liste des events : https://cyrillschumacher.com/magento-2.3-list-of-all-dispatched-events/

Les event magiques

Il existe pour chaque modèle des observers magiques sur les fonctions load, save et delete. Ils sont visibles dans la classe Magento\Framework\Model\AbstractModel. Idem pour les fonction preDispatch et postDispatch des controllers, qui sont visibles dans la classe Magento\Framework\App\Action\Action.

TP - Le site ne doit être accessible qu'aux clients connectés

En utilisant un observer, faire en sorte de rediriger toutes les pages vers le formulaire de login si le client n'est pas connecté.

  • Nous utiliserons l'event magique sur le preDispatch
  • Attention, il ne faut pas que cet observer se déclenche si nous sommes sur la page de login et sur la page de post login

Pour vérifier que le client est connecté, utiliser la classe \Magento\Framework\App\Http\Context :

$this->httpContext->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)

Cette méthode permet d'éviter les problèmes avec le full page cache

Pour rediriger dans un observer, il est possible d'utiliser la classe suivante :

/**
 * @var \Magento\Framework\App\Response\RedirectInterface
 */
private $redirect;

[...]
/** @var \Magento\Framework\App\Action\Action $controller */
$controller = $observer->getControllerAction();

$this->redirect->redirect($controller->getResponse(), 'customer/account/login');

// ou directement
$controller->getResponse()->setRedirect('customer/account/login');

Il est aussi possible de passer le flag FLAG_NO_DISPATCH afin de ne pas exécuter tout le code suivant.

$controller->getActionFlag()->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);