Dans Drupal 8, le principe des hooks a été remplacé par un système d'évènement qui est lancé et peut être intercepté, cela se passe en 3 étapes :
- Création de l'évènement (classe étendant la classe Event)
- Lancer l'évènement
- Interception de l'évènement (Classe étendant l'interface EventSubscriberInterface)
Pour cette évènement, nous allons prendre le contexte de mon site de pronostics sportifs. Je veux lancer un évènement quand un utilisateur fait ses pronostics
Création de l'évènement
Fichier : mon_module/src/Event/UserBetEvent.php
<?php
namespace Drupal\mon_module\Event;
use Drupal\mespronos\Entity\Day;
use Drupal\user\UserInterface;
use Symfony\Component\EventDispatcher\Event;
class UserBetEvent extends Event {
const EVENT_NAME = 'mespronos_user_bet';
/**
* The user account.
*
* @var \Drupal\user\UserInterface
*/
public $account;
/**
* The Day the user has bet on
*
* @var Day
*/
public $day;
public function __construct(UserInterface $account, Day $day) {
$this->account = $account;
$this->day = $day;
}
}
Cette classe est relativement simple, on défini les attributs que l'on veut rendre disponibles lors de l'interception de cet évènement, ici, l'objet User de l'utilisateur qui aura pronostiqué et la journée ($day) de compétition sur laquelle il aura fait ses pronostics.
Dispatch de l'évènement
Le code suivant est à placer là où vous souhaiter lancer l'évènement, dans mon cas il s'agit de la méthode submit de mon formulaire de pronostics :
$event = new UserBetEvent($user, $day);
$event_dispatcher = \Drupal::service('event_dispatcher');
$event_dispatcher->dispatch(UserBetEvent::EVENT_NAME, $event);
Évidement, il ne faut pas oublier de passer les paramètres que l'on a défini dans le constructeur de notre évènement (ici $user et $day)
Interception de l'évènement
Définition du subscriber
Fichier : mon_autre_module/mon_autre_module.services.yml
mon_autre_module.mespronos_user_bet:
class: 'Drupal\mon_autre_module\EventSubscriber\UserBetSubscriber'
tags:
- { name: 'event_subscriber' }
Code du subscriber
Fichier : mon_autre_module/src/EventSubscriber/UserBetSubscriber.php
<?php
namespace Drupal\mon_autre_module\EventSubscriber;
use Drupal\mespronos\Event\UserBetEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class UserBetSubscriber implements EventSubscriberInterface {
public function onBet(UserBetEvent $event) {
// On peut récuperer les attributs de l'évènement
$user = $event->account;
$day = $event->day;
// À vous de faire ce que vous voulez ici
}
public static function getSubscribedEvents() {
// Définition du ou des évènements que l'on écoute et méthode à executer
return [
UserBetEvent::EVENT_NAME => 'onBet',
];
}
}
Contenus en rapport
Version actualisée de Drupal 8 - Créer un Event, le lancer et l'intercepter pour drupal 10+
Ajouter un commentaire