Symfony - EventListener i EventListener

Symfony zapewnia programowanie oparte na zdarzeniach poprzez jego EventDispatcherskładnik. Każda aplikacja korporacyjna wymaga programowania opartego na zdarzeniach, aby utworzyć aplikację o dużych możliwościach dostosowania. Zdarzenia to jedno z głównych narzędzi interakcji obiektów. Bez zdarzeń obiekt nie współdziała efektywnie.

Proces programowania opartego na zdarzeniach można podsumować jako - Obiekt o nazwie Event sourceprosi obiekt centralnego dyspozytora o zarejestrowanie zdarzenia, na przykład user.registered. Jeden lub więcej obiektów, zwanych listener, pyta obiekt centralnego dyspozytora, że ​​chce nasłuchiwać określonego zdarzenia, np. User.registered. W pewnym momencie obiekt Źródło zdarzenia prosi obiekt centralnego dyspozytora o wywołanie zdarzenia, na przykład user.registered, wraz z obiektem Event z niezbędnymi informacjami. Centralny dyspozytor informuje wszystkie obiekty nasłuchujące o zdarzeniu, na przykład user.registered i jego obiekt Event *.

W programowaniu opartym na zdarzeniach mamy cztery typy obiektów: źródło zdarzenia, nasłuchiwanie zdarzeń, dyspozytor parzysty i samo zdarzenie.

Napiszmy prostą aplikację, aby zrozumieć koncepcję.

Step 1 - Stwórz projekt, event-dispatcher-example.

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

Step 2 - Utwórz klasę, .User.

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

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

Step 3 - Utwórz wydarzenie, 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);

Tutaj, UserRegisteredEvent ma dostęp do Userobiekt. Nazwa wydarzenia touser.registered.

Step 4 - Utwórz słuchacza, 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 - Utwórz obiekt rozsyłacza zdarzeń.

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

Step 6 - Połącz detektor i zdarzenie za pomocą obiektu dispatcher i jego metody, addListener.

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

Możemy również dodać anonimową funkcję jako odbiornik zdarzeń, jak pokazano w poniższym kodzie.

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

Step 7 - Na koniec odpal / wyślij zdarzenie metodą dyspozytora zdarzeń, dispatch.

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

Pełna lista kodów jest następująca.

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

Wynik

Jon 
Jon 
25

Framework sieciowy Symfony ma wiele zdarzeń i można zarejestrować słuchacza dla tych zdarzeń i odpowiednio go zaprogramować. Jednym z przykładowych zdarzeń jest kernel.exception, a odpowiadającym mu zdarzeniemGetResponseForExceptionEvent, która przechowuje obiekt odpowiedzi (dane wyjściowe żądania internetowego). Służy do przechwytywania wyjątku i modyfikowania odpowiedzi za pomocą ogólnych informacji o błędzie zamiast pokazywania użytkownikom błędu w czasie wykonywania.