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

Version actualisée de Drupal 8 - Créer un Event, le lancer et l'intercepter pour drupal 10+

Nous allons voir ici comment créer un Event, le lancer et l'intercepter.

Cet évènement sera lancé lorsqu'un utilisateur se connecte au site.

Création de l'event

Dans modules/monmodule/src/Event/UserLoginEvent.php

<?php

namespace Drupal\monmodule\Event;

use Drupal\user\UserInterface;
use Drupal\Component\EventDispatcher\Event;

/**
 * Event that is fired when a user logs in.
 */
class UserLoginEvent extends Event {

  const EVENT_NAME = 'kgaut_tools_user_login';

  /**
   * The user account.
   *
   * @var \Drupal\user\UserInterface
   */
  public $account;

  /**
   * Constructs the object.
   *
   * @param \Drupal\user\UserInterface $account
   *   The account of the user logged in.
   */
  public function __construct(UserInterface $account) {
    $this->account = $account;
  }
}

Lancement de l'Event (dispatcher)

Dans mon cas en particulier, je dois répondre lorsqu'un utilisateur se connecte, je vais donc utiliser le hook HOOK_user_login.

Dans modules/monmodule/monmodule.module

function monmodule_user_login($account) {
  $event = new \Drupal\monmodule\Event\UserLoginEvent($account);
  /** @var \Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher $event_dispatcher */
  $event_dispatcher = \Drupal::service('event_dispatcher');
  $event_dispatcher->dispatch($event, $event::EVENT_NAME);
}

Interception de l'évènement (Subscriber)

Nous allons pour cela créer un EventSubscriber.

Dans modules/monmodule/src/EventSubscriber/UserLoginSubscriber.php

<?php

namespace Drupal\monmodule\EventSubscriber;

use Drupal\monmodule\Event\UserLoginEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class UserLoginSubscriber implements EventSubscriberInterface {

  public static function getSubscribedEvents() {
    // Ici on défini pour chaque évènement, la méthode à utiliser
    return [UserLoginEvent::EVENT_NAME => 'UserLoginCallback'];
  }

  public function UserLoginCallback(UserLoginEvent $event) {
    $account = $event->account;
    //Ici faire le traitement voulu
  }

}

Note : Pour cette dernière partie, il est aussi possible d'utiliser la commande drush :

drush generate service:event-subscriber

Contenus en rapport

Ajouter un commentaire

Ne sera pas publié
CAPTCHA
Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...