PHP Academy · Урок

EventDispatcher: слабо связанные события

Отправляйте события и подписывайтесь на них с помощью EventDispatcher Symfony

Урок 3 из 413 шагов

«EventDispatcher: слабо связанные события» — бесплатный урок PHP Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.

Что такое EventDispatcher?

Symfony EventDispatcher реализует шаблон «Наблюдатель». Код отправляет события, а обработчики реагируют на них, причем диспетчеру не нужно ничего знать об обработчиках.

Установка

Установите компонент.

$ composer require symfony/event-dispatcher

Создание события

Событие — это обычный класс PHP, который часто расширяет Event (необязательно) и содержит данные.

<?php
use Symfony\Contracts\EventDispatcher\Event;

class UserRegisteredEvent extends Event
{
    public const NAME = "user.registered";

    public function __construct(public readonly User $user) {}
}

Создание обработчика

Обработчик — это вызываемый объект или объект, реагирующий на определенное событие.

<?php
class SendWelcomeEmailListener
{
    public function __invoke(UserRegisteredEvent $event): void
    {
        mail($event->user->email, "Welcome!", "Thanks for joining!");
    }
}

Регистрация обработчиков

Подключите обработчики к диспетчеру.

<?php
use Symfony\Component\EventDispatcher\EventDispatcher;

$dispatcher = new EventDispatcher();
$dispatcher->addListener(
    UserRegisteredEvent::NAME,
    new SendWelcomeEmailListener()
);

Отправка события

Отправьте событие — все зарегистрированные обработчики будут вызваны в порядке приоритета.

<?php
$user = new User("alice@example.com");
$dispatcher->dispatch(new UserRegisteredEvent($user), UserRegisteredEvent::NAME);

Приоритет обработчика

Передайте целое число приоритета третьим аргументом в addListener(). Сначала выполняются обработчики с более высокими значениями (по умолчанию: 0).

<?php
$dispatcher->addListener("user.registered", $logListener, 10);   // runs first
$dispatcher->addListener("user.registered", $emailListener, 0);  // runs second

Подписчики на события

Подписчик на события — это класс, который самостоятельно регистрирует свои обработчики, реализуя EventSubscriberInterface.

<?php
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class UserSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array {
        return [
            UserRegisteredEvent::NAME => "onUserRegistered",
        ];
    }

    public function onUserRegistered(UserRegisteredEvent $event): void {
        // ...
    }
}

Остановка распространения

Вызовите $event->stopPropagation() внутри обработчика, чтобы предотвратить выполнение последующих обработчиков.

В Laravel

В Laravel есть собственная система событий. Отправляйте событие с помощью event(new UserRegistered($user)). Регистрируйте обработчики в EventServiceProvider или используйте атрибут #[Listen].

Преимущества событийной архитектуры

События уменьшают связанность компонентов: сервис регистрации не импортирует сервис электронной почты. Новое поведение (ведение журнала, аналитика) можно добавить, зарегистрировав новые обработчики, не изменяя существующий код.

Итоги

Создавайте классы событий с данными, подключайте обработчики с помощью addListener(), а события отправляйте через $dispatcher->dispatch(). Используйте подписчиков для групп обработчиков, которые регистрируют себя самостоятельно.

Быстрая проверка

Как остановить выполнение последующих обработчиков?

Можно начать бесплатно

Изучай PHP с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
49
Уроки
195

Часто задаваемые вопросы

Урок «EventDispatcher: слабо связанные события» бесплатный?

Да — полный текст урока «EventDispatcher: слабо связанные события» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.

Чему я научусь в уроке «EventDispatcher: слабо связанные события»?

Отправляйте события и подписывайтесь на них с помощью EventDispatcher Symfony Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать PHP Academy?

Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «EventDispatcher: слабо связанные события»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке PHP Academy?

Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. HttpFoundation: запрос и ответ
  2. Контейнер DependencyInjection
  3. EventDispatcher: слабо связанные события
  4. Компонент Console: команды CLI
← Назад к PHP Academy