Symfony - Eventos e EventListener

Symfony fornece programação baseada em eventos por meio de seu EventDispatchercomponente. Qualquer aplicativo corporativo precisa de programação baseada em eventos para criar um aplicativo altamente personalizável. Os eventos são uma das principais ferramentas para os objetos interagirem entre si. Sem eventos, um objeto não interage de forma eficiente.

O processo de programação baseada em eventos pode ser resumido como - Um objeto, chamado Event sourcepede ao objeto central dispatcher para registrar um evento, digamos user.registered. Um ou mais objetos, chamados de ouvinte, perguntam ao objeto do despachante central que deseja ouvir um evento específico, digamos usuário.registrado. Em algum ponto do tempo, o objeto de origem do Evento pede ao objeto do despachante central para despachar o evento, digamos user.registered junto com um objeto Event com as informações necessárias. O despachante central informa todos os objetos ouvintes sobre o evento, digamos user.registered e seu objeto Event *.

Na programação baseada em eventos, temos quatro tipos de objetos: Event Source, Event Listener, Even Dispatcher e o próprio Event.

Vamos escrever um aplicativo simples para entender o conceito.

Step 1 - Crie um projeto, event-dispatcher-example.

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

Step 2 - Crie uma classe, .User.

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

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

Step 3 - Crie um 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);

Aqui, UserRegisteredEvent tem acesso a Userobjeto. O nome do evento éuser.registered.

Step 4 - Crie um ouvinte, 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 - Crie um objeto dispatcher de evento.

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

Step 6 - Conecte o ouvinte e o evento usando o objeto do distribuidor e seu método, addListener.

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

Também podemos adicionar uma função anônima como ouvinte de eventos, conforme mostrado no código a seguir.

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

Step 7 - Por fim, dispare / despache o evento usando o método do despachante de evento, dispatch.

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

A lista de códigos completa é a seguinte.

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

Resultado

Jon 
Jon 
25

O framework da web Symfony tem muitos eventos e pode-se registrar o ouvinte para esses eventos e programá-lo de acordo. Um dos eventos de amostra é kernel.exception e o evento correspondente éGetResponseForExceptionEvent, que contém o objeto de resposta (a saída de uma solicitação da web). Isso é usado para capturar a exceção e modificar a resposta com informações de erro genéricas, em vez de mostrar o erro de tempo de execução aos usuários.