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 , которое содержит объект ответа (вывод веб-запроса). Это используется для перехвата исключения и изменения ответа с помощью общей информации об ошибке, а не для отображения ошибки времени выполнения для пользователей.