Symfony - Eventos y EventListener

Symfony proporciona programación basada en eventos a través de su EventDispatchercomponente. Cualquier aplicación empresarial necesita una programación basada en eventos para crear una aplicación altamente personalizable. Los eventos son una de las principales herramientas para que los objetos interactúen entre sí. Sin eventos, un objeto no interactúa de manera eficiente.

El proceso de programación basada en eventos se puede resumir como: Un objeto, llamado Event sourcepide al objeto despachador central que registre un evento, digamos user.registered. Uno o más objetos, llamado escucha le pregunta al objeto despachador central que quiere escuchar un evento específico, digamos usuario.registrado. En algún momento, el objeto de origen del evento le pide al objeto despachador central que envíe el evento, digamos user.registered junto con un objeto de evento con la información necesaria. El despachador central informa a todos los objetos de escucha sobre el evento, digamos user.registered y su objeto Event *.

En la programación basada en eventos, tenemos cuatro tipos de objetos: fuente de eventos, escucha de eventos, incluso despachador y el evento en sí.

Escribamos una aplicación sencilla para comprender el concepto.

Step 1 - Crear un proyecto, event-dispatcher-example.

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

Step 2 - Crea una clase, .User.

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

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

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

Aquí, UserRegisteredEvent tiene acceso a Userobjeto. El nombre del evento esuser.registered.

Step 4 - Crea un oyente, 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 objeto despachador de eventos.

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

Step 6 - Conecte el oyente y el evento usando el objeto despachador y su método, addListener.

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

También podemos agregar una función anónima como detector de eventos como se muestra en el siguiente código.

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

Step 7 - Finalmente, dispara / despacha el evento usando el método del despachador de eventos, dispatch.

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

La lista completa de códigos es la siguiente.

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

El framework web Symfony tiene muchos eventos y uno puede registrar un oyente para esos eventos y programarlo en consecuencia. Uno de los eventos de muestra es kernel.exception y el evento correspondiente esGetResponseForExceptionEvent, que contiene el objeto de respuesta (el resultado de una solicitud web). Esto se utiliza para detectar la excepción y modificar la respuesta con información de error genérica en lugar de mostrar el error de tiempo de ejecución a los usuarios.