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

<?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',
    ];
  }

}

 

Aller plus loin ?

Ajouter un commentaire