Учебники

Symfony — События и EventListener

Symfony обеспечивает программирование на основе событий через свой компонент EventDispatcher . Любое корпоративное приложение нуждается в программировании на основе событий для создания настраиваемого приложения. События являются одним из основных инструментов взаимодействия объектов друг с другом. Без событий объект не взаимодействует эффективно.

Процесс программирования, основанного на событиях, можно обобщить следующим образом: — объект, называемый источником события, просит центральный диспетчерский объект зарегистрировать событие, например, user.registered. Один или несколько объектов, называемых слушателем, запрашивают у центрального объекта диспетчера, что он хочет прослушать определенное событие, например, user.registered. В какой-то момент времени исходный объект Event просит центральный диспетчерский объект отправить событие, скажем, user.registered вместе с объектом Event вместе с необходимой информацией. Центральный диспетчер информирует все объекты слушателя о событии, например, user.registered и его объект Event *.

В программировании на основе событий у нас есть четыре типа объектов: источник события, прослушиватель событий, даже диспетчер событий и само событие.

Давайте напишем простое приложение, чтобы понять концепцию.

Шаг 1 — Создайте проект, пример события-диспетчера .

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

Шаг 2 — Создать класс .User .

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

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

Шаг 3 — Создать событие 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);

Здесь UserRegisteredEvent имеет доступ к объекту User . Название мероприятия — user.registered .

Шаг 4 — Создайте слушателя, UserListener .

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

Шаг 5 — Создайте объект диспетчера событий.

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

Шаг 6 — Соедините слушатель и событие, используя объект диспетчера и его метод, addListener .

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

Мы также можем добавить анонимную функцию в качестве прослушивателя событий, как показано в следующем коде.

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

Шаг 7 — Наконец, запустить / отправить событие, используя метод диспетчера событий, dispatch .

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

Полный список кодов выглядит следующим образом.

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

Результат

Jon 
Jon 
25

Веб-фреймворк Symfony имеет много событий, и можно зарегистрировать прослушиватель этих событий и запрограммировать его соответствующим образом. Одним из примеров события является kernel.exception, а соответствующее событие — GetResponseForExceptionEvent , которое содержит объект ответа (вывод веб-запроса). Это используется для перехвата исключения и изменения ответа с помощью общей информации об ошибке, а не для отображения ошибки времени выполнения для пользователей.