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
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 :
Ajouter un commentaire