Symfony - Événements et EventListener

Symfony propose une programmation événementielle via son EventDispatchercomposant. Toute application d'entreprise a besoin d'une programmation basée sur les événements pour créer une application hautement personnalisable. Les événements sont l'un des principaux outils permettant aux objets d'interagir les uns avec les autres. Sans événements, un objet n'interagit pas efficacement.

Le processus de programmation basée sur les événements peut être résumé comme suit: - Un objet, appelé Event sourcedemande à l'objet répartiteur central d'enregistrer un événement, par exemple user.registered. Un ou plusieurs objets, appelés écouteur, demandent à l'objet répartiteur central qu'il souhaite écouter un événement spécifique, par exemple user.registered. À un moment donné, l'objet source d'événement demande à l'objet répartiteur central de distribuer l'événement, par exemple user.registered avec un objet Event avec les informations nécessaires. Le répartiteur central informe tous les objets écouteurs de l'événement, par exemple user.registered et son objet Event *.

Dans la programmation basée sur les événements, nous avons quatre types d'objets: la source de l'événement, l'écouteur d'événements, le répartiteur même et l'événement lui-même.

Écrivons une application simple pour comprendre le concept.

Step 1 - Créer un projet, event-dispatcher-example.

cd /path/to/dir 
mkdir event-dispatcher-example 
cd event-dispatcher-example 
composer require symfony/event-dispatcher

Step 2 - Créer une classe, .User.

class User { 
   public $name; 
   public $age; 
}  

$user = new User(); 
$user->name = "Jon"; 
$user->age = 25

Step 3 - Créer un événement, UserRegisteredEvent.

use Symfony\Component\EventDispatcher\Event;  
class UserRegisteredEvent extends Event {
   const NAME = 'user.registered';  
   protected $user;  
   
   public function __construct(User $user) { 
      $this-<user = $user; 
   }  
   public function getUser() { 
      return $this-<user; 
   } 
}  
$event = new UserRegisteredEvent($user);

Ici, UserRegisteredEvent a accès à Userobjet. Le nom de l'événement estuser.registered.

Step 4 - Créer un auditeur, UserListener.

class UserListener { 
   public function onUserRegistrationAction(Event $event) { 
      $user = $event->getUser(); 
         echo $user->name . "\r\n"; 
         echo $user->age . "\r\n"; 
   } 
}  
$listener = new UserListener();

Step 5 - Créez un objet répartiteur d'événements.

use Symfony\Component\EventDispatcher\EventDispatcher;  
$dispatcher = new EventDispatcher();

Step 6 - Connecter l'écouteur et l'événement en utilisant l'objet dispatcher et sa méthode, addListener.

$dispatcher 
   ->addListener( 
      UserRegisteredEvent::NAME,  
      array($listener, 'onUserRegistrationAction'));

Nous pouvons également ajouter une fonction anonyme en tant qu'écouteur d'événements, comme indiqué dans le code suivant.

$dispatcher 
   ->addListener( 
      UserRegisteredEvent::NAME,  
      
      function(Event $event) { 
         $user = $event->getUser(); 
         echo $user->name . "\r\n"; 
      });

Step 7 - Enfin, déclenchez / répartissez l'événement en utilisant la méthode du répartiteur d'événements, dispatch.

$dispatcher->dispatch(UserRegisteredEvent::NAME, $event);

La liste complète des codes est la suivante.

main.php

<?php  
   require __DIR__ . '/vendor/autoload.php';  
   use Symfony\Component\EventDispatcher\EventDispatcher; 
   use Symfony\Component\EventDispatcher\Event;  

   class User { 
      public $name; 
      public $age; 
   }  
   class UserRegisteredEvent extends Event { 
      const NAME = 'user.registered';  
      protected $user;  
      
      public function __construct(User $user) { 
         $this->user = $user; 
      }  
      public function getUser() { 
         return $this->user; 
      } 
   }  
   class UserListener { 
      public function onUserRegistrationAction(Event $event) { 
         $user = $event->getUser(); 
         echo $user->name . "\r\n"; 
         echo $user->age . "\r\n"; 
      } 
   } 
   $user = new User(); 
   $user->name = "Jon"; 
   $user->age = 25;  

   $event = new UserRegisteredEvent($user); 
   $listener = new UserListener();  

   $dispatcher = new EventDispatcher();  
   $dispatcher 
      ->addListener( 
         UserRegisteredEvent::NAME, 
         
         function(Event $event) { 
            $user = $event->getUser(); 
            echo $user->name . "\r\n"; 
         });  
   $dispatcher 
      ->addListener( 
         UserRegisteredEvent::NAME, array($listener, 'onUserRegistrationAction'));

   $dispatcher->dispatch(UserRegisteredEvent::NAME, $event); 
?>

Résultat

Jon 
Jon 
25

Le framework Web Symfony a beaucoup d'événements et on peut enregistrer un auditeur pour ces événements et le programmer en conséquence. L'un des exemples d'événement est kernel.exception et l'événement correspondant estGetResponseForExceptionEvent, qui contient l'objet de réponse (la sortie d'une requête Web). Ceci est utilisé pour intercepter l'exception et modifier la réponse avec des informations d'erreur génériques au lieu d'afficher l'erreur d'exécution aux utilisateurs.