Drupal 8 - Créer un Event, le lancer et l'intercepter

Posté le Mardi 4 juin 2019 - 11:55

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 :

  1. Création de l'évènement (classe étendant la classe Event)
  2. Lancer l'évènement
  3. 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

  1. <?php
  2.  
  3. namespace Drupal\mon_module\Event;
  4.  
  5. use Drupal\mespronos\Entity\Day;
  6. use Drupal\user\UserInterface;
  7. use Symfony\Component\EventDispatcher\Event;
  8.  
  9. class UserBetEvent extends Event {
  10.  
  11. const EVENT_NAME = 'mespronos_user_bet';
  12.  
  13. /**
  14.   * The user account.
  15.   *
  16.   * @var \Drupal\user\UserInterface
  17.   */
  18. public $account;
  19.  
  20. /**
  21.   * The Day the user has bet on
  22.   *
  23.   * @var Day
  24.   */
  25. public $day;
  26.  
  27. public function __construct(UserInterface $account, Day $day) {
  28. $this->account = $account;
  29. $this->day = $day;
  30. }
  31.  
  32. }

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 :

  1. $event = new UserBetEvent($user, $day);
  2. $event_dispatcher = \Drupal::service('event_dispatcher');
  3. $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

  1. mon_autre_module.mespronos_user_bet:
  2.   class: 'Drupal\mon_autre_module\EventSubscriber\UserBetSubscriber'
  3.   tags:
  4.   - { name: 'event_subscriber' }

Code du subscriber

Fichier : mon_autre_module/src/EventSubscriber/UserBetSubscriber.php

  1. <?php
  2.  
  3. namespace Drupal\mon_autre_module\EventSubscriber;
  4.  
  5. use Drupal\mespronos\Event\UserBetEvent;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7.  
  8. class UserBetSubscriber implements EventSubscriberInterface {
  9.  
  10. public function onBet(UserBetEvent $event) {
  11. // On peut récuperer les attributs de l'évènement
  12. $user = $event->account;
  13. $day = $event->day;
  14.  
  15. // À vous de faire ce que vous voulez ici
  16. }
  17.  
  18. public static function getSubscribedEvents() {
  19. // Définition du ou des évènements que l'on écoute et méthode à executer
  20. return [
  21. UserBetEvent::EVENT_NAME => 'onBet',
  22. ];
  23. }
  24.  
  25. }

 

 

Ajouter un commentaire

Ne sera pas publié

HTML restreint

  • Balises HTML autorisées : <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Les adresses de pages web et les adresses courriel se transforment en liens automatiquement.
CAPTCHA
Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...