EventDispatcher: слабо связанные события
Отправляйте события и подписывайтесь на них с помощью EventDispatcher Symfony
«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 — локальная установка не требуется.
Все уроки этого курса
- HttpFoundation: запрос и ответ
- Контейнер DependencyInjection
- EventDispatcher: слабо связанные события
- Компонент Console: команды CLI