Какие технические события происходят после создания агрегатора событий?

«Какие технические события происходят после создания агрегатора событий?» — вопрос из категории Архитектура, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

После создания и инициализации агрегатора событий (например, экземпляра EventDispatcher в Symfony) система готова к работе по следующему принципу:

  1. Регистрация слушателей (Listeners/Subscribers): Код приложения связывает обработчики с конкретными событиями, используя методы агрегатора, такие как addListener() или addSubscriber(). Эти обработчики помещаются в внутреннюю структуру данных (обычно массив или словарь), сгруппированную по имени события.
  2. Диспетчеризация события: Когда в коде вызывается метод dispatch($event), агрегатор выполняет:
    • Создание объекта события: Если передан строковый идентификатор, агрегатор может инстанцировать соответствующий класс события.
    • Поиск слушателей: Агрегатор находит всех зарегистрированных слушателей для данного события, учитывая их приоритет.
    • Синхронный вызов: Каждый слушатель вызывается последовательно, и ему передается объект события для обработки.
  3. Обработка в слушателях: Внутри слушателя можно:
    • Выполнить бизнес-логику, связанную с событием (отправка 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), обеспечивая слабую связанность компонентов системы.