Symfony - События и EventListener
Symfony обеспечивает программирование на основе событий через свои EventDispatcherсоставная часть. Любое корпоративное приложение нуждается в программировании на основе событий для создания гибко настраиваемого приложения. События - это один из основных инструментов взаимодействия объектов друг с другом. Без событий объект не взаимодействует эффективно.
Процесс программирования на основе событий можно резюмировать как - Объект, называемый Event sourceпросит центральный диспетчерский объект зарегистрировать событие, например, user.registered. Один или несколько объектов, называемых слушателем, запрашивают объект центрального диспетчера, что он хочет прослушать определенное событие, например, user.registered. В какой-то момент объект-источник события просит центральный объект-диспетчер отправить событие, например, user.registered вместе с объектом Event с необходимой информацией. Центральный диспетчер информирует все объекты-слушатели о событии, например, user.registered и его объект Event *.
В программировании на основе событий у нас есть четыре типа объектов: источник событий, прослушиватель событий, даже диспетчер событий и само событие.
Давайте напишем простое приложение, чтобы понять концепцию.
Step 1 - Создать проект, event-dispatcher-example.
cd /path/to/dir
mkdir event-dispatcher-example
cd event-dispatcher-example
composer require symfony/event-dispatcher
Step 2 - Создайте класс, .User.
class User {
public $name;
public $age;
}
$user = new User();
$user->name = "Jon";
$user->age = 25
Step 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.
Step 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();
Step 5 - Создать объект диспетчера событий.
use Symfony\Component\EventDispatcher\EventDispatcher;
$dispatcher = new EventDispatcher();
Step 6 - Подключить слушателя и событие, используя объект диспетчера и его метод, addListener.
$dispatcher
->addListener(
UserRegisteredEvent::NAME,
array($listener, 'onUserRegistrationAction'));
Мы также можем добавить анонимную функцию в качестве прослушивателя событий, как показано в следующем коде.
$dispatcher
->addListener(
UserRegisteredEvent::NAME,
function(Event $event) {
$user = $event->getUser();
echo $user->name . "\r\n";
});
Step 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, который содержит объект ответа (вывод веб-запроса). Это используется для перехвата исключения и изменения ответа с использованием общей информации об ошибке вместо отображения ошибок времени выполнения для пользователей.