Ответ
После создания и инициализации агрегатора событий (например, экземпляра EventDispatcher в Symfony) система готова к работе по следующему принципу:
- Регистрация слушателей (Listeners/Subscribers): Код приложения связывает обработчики с конкретными событиями, используя методы агрегатора, такие как
addListener()илиaddSubscriber(). Эти обработчики помещаются в внутреннюю структуру данных (обычно массив или словарь), сгруппированную по имени события. - Диспетчеризация события: Когда в коде вызывается метод
dispatch($event), агрегатор выполняет:- Создание объекта события: Если передан строковый идентификатор, агрегатор может инстанцировать соответствующий класс события.
- Поиск слушателей: Агрегатор находит всех зарегистрированных слушателей для данного события, учитывая их приоритет.
- Синхронный вызов: Каждый слушатель вызывается последовательно, и ему передается объект события для обработки.
- Обработка в слушателях: Внутри слушателя можно:
- Выполнить бизнес-логику, связанную с событием (отправка email, запись лога, инвалидация кеша).
- Модифицировать данные внутри объекта события.
- Остановить дальнейшую передачу события другим слушателям с помощью метода
stopPropagation().
Пример на Symfony EventDispatcher:
use SymfonyComponentEventDispatcherEventDispatcher;
// 1. Создание агрегатора
$dispatcher = new EventDispatcher();
// 2. Регистрация слушателя на событие 'user.created'
$dispatcher->addListener('user.created', function (UserCreatedEvent $event) {
// Логика обработки, например, отправка приветственного письма
$this->mailer->sendWelcomeEmail($event->getUser());
});
// 3. Где-то в сервисе создания пользователя — диспетчеризация события
$userCreatedEvent = new UserCreatedEvent($newUser);
$dispatcher->dispatch($userCreatedEvent, 'user.created');
Ключевые технические аспекты:
- Обработка по умолчанию происходит синхронно в том же потоке выполнения.
- Приоритет слушателей позволяет управлять порядком вызова.
- Propagation (распространение) события можно остановить, что полезно для реализации механизмов типа "первый обработавший".
- Агрегатор часто реализует шаблон Наблюдатель (Observer), обеспечивая слабую связанность компонентов системы.