Symfony - Eventi ed EventListener

Symfony fornisce la programmazione basata su eventi tramite il suo EventDispatchercomponente. Qualsiasi applicazione aziendale necessita di programmazione basata su eventi per creare un'applicazione altamente personalizzabile. Gli eventi sono uno degli strumenti principali per l'interazione tra gli oggetti. Senza eventi, un oggetto non interagisce in modo efficiente.

Il processo di programmazione basata su eventi può essere riassunto come - Un oggetto, chiamato Event sourcechiede all'oggetto del dispatcher centrale di registrare un evento, ad esempio user.registered. Uno o più oggetti, chiamati listener, chiedono all'oggetto del dispatcher centrale che desidera ascoltare un evento specifico, ad esempio user.registered. Ad un certo punto del tempo, l'oggetto di origine dell'evento chiede all'oggetto del dispatcher centrale di inviare l'evento, ad esempio user.registered insieme a un oggetto Event con le informazioni necessarie. Il dispatcher centrale informa tutti gli oggetti listener sull'evento, ad esempio user.registered e il suo oggetto Event *.

Nella programmazione basata su eventi, abbiamo quattro tipi di oggetti: Origine evento, Listener di eventi, Even Dispatcher e l'evento stesso.

Scriviamo una semplice applicazione per comprendere il concetto.

Step 1 - Crea un progetto, event-dispatcher-example.

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

Step 2 - Crea una classe, .User.

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

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

Step 3 - Crea un evento, 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);

Qui, UserRegisteredEvent ha accesso a Useroggetto. Il nome dell'evento èuser.registered.

Step 4 - Crea un ascoltatore, 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 - Crea un oggetto dispatcher di eventi.

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

Step 6 - Connetti ascoltatore ed evento utilizzando l'oggetto dispatcher e il suo metodo, addListener.

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

Possiamo anche aggiungere una funzione anonima come listener di eventi come mostrato nel codice seguente.

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

Step 7 - Infine, attiva / invia l'evento utilizzando il metodo del dispatcher di eventi, dispatch.

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

L'elenco completo del codice è il seguente.

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); 
?>

Risultato

Jon 
Jon 
25

Il framework web di Symfony ha molti eventi e si può registrare l'ascoltatore per quegli eventi e programmarlo di conseguenza. Uno degli eventi di esempio è kernel.exception e l'evento corrispondente èGetResponseForExceptionEvent, che contiene l'oggetto risposta (l'output di una richiesta web). Viene utilizzato per rilevare l'eccezione e modificare la risposta con informazioni generiche sull'errore invece di mostrare l'errore di runtime agli utenti.