РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
750 of 1361 menu

Класс EventSubscriber

Класс EventSubscriber реализует интерфейс EventSubscriberInterface и описывает подписчика событий. Подписчик возвращает из статического метода getSubscribedEvents массив, в котором ключи - это имена событий, а значения - методы этого же класса, которые нужно вызвать при наступлении события. В отличие от обычного слушателя, подписчик сам сообщает диспетчеру, на что он подписан, поэтому его достаточно один раз зарегистрировать через addSubscriber.

Синтаксис

<?php namespace AppEventSubscriber; use SymfonyComponentEventDispatcherEventSubscriberInterface; class MySubscriber implements EventSubscriberInterface { public static function getSubscribedEvents(): array { return [ 'event.name' => 'onEventName', ]; } public function onEventName(Event $event): void { } } ?>

Пример

Давайте создадим подписчика, который реагирует на событие 'article.created' и выводит сообщение:

<?php namespace AppEventSubscriber; use SymfonyComponentEventDispatcherEventSubscriberInterface; use SymfonyContractsEventDispatcherEvent; class ArticleSubscriber implements EventSubscriberInterface { public static function getSubscribedEvents(): array { return [ 'article.created' => 'onArticleCreated', ]; } public function onArticleCreated(Event $event): void { echo 'article created'; } } ?>

Теперь зарегистрируем подписчика в диспетчере:

<?php namespace AppController; use AppEventSubscriberArticleSubscriber; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentEventDispatcherEventDispatcher; use SymfonyComponentHttpFoundationResponse; class ArticleController extends AbstractController { public function index(): Response { $dispatcher = new EventDispatcher(); $dispatcher->addSubscriber(new ArticleSubscriber()); $dispatcher->dispatch(new Event(), 'article.created'); return new Response('ok'); } } ?>

Результат выполнения кода:

article created

Пример

Давайте подпишемся на несколько событий сразу:

<?php namespace AppEventSubscriber; use SymfonyComponentEventDispatcherEventSubscriberInterface; use SymfonyContractsEventDispatcherEvent; class ArticleSubscriber implements EventSubscriberInterface { public static function getSubscribedEvents(): array { return [ 'article.created' => 'onArticleCreated', 'article.deleted' => 'onArticleDeleted', ]; } public function onArticleCreated(Event $event): void { echo 'created'; } public function onArticleDeleted(Event $event): void { echo 'deleted'; } } ?>

Результат выполнения кода при вызове события 'article.deleted':

"deleted"

Пример

Давайте укажем приоритет для метода-обработчика. Чем больше число, тем раньше сработает метод:

<?php namespace AppEventSubscriber; use SymfonyComponentEventDispatcherEventSubscriberInterface; use SymfonyContractsEventDispatcherEvent; class ArticleSubscriber implements EventSubscriberInterface { public static function getSubscribedEvents(): array { return [ 'article.created' => ['onArticleCreated', 10], ]; } public function onArticleCreated(Event $event): void { echo 'high priority'; } } ?>

Результат выполнения кода:

"high priority"

Пример

Давайте подпишем один метод на несколько событий:

<?php namespace AppEventSubscriber; use SymfonyComponentEventDispatcherEventSubscriberInterface; use SymfonyContractsEventDispatcherEvent; class ArticleSubscriber implements EventSubscriberInterface { public static function getSubscribedEvents(): array { return [ 'article.created' => 'onArticleChange', 'article.deleted' => 'onArticleChange', ]; } public function onArticleChange(Event $event): void { echo 'changed'; } } ?>

Результат выполнения кода при вызове события 'article.created':

"changed"

Смотрите также

  • метод addSubscriber,
    который регистрирует подписчика в диспетчере
  • метод getSubscribedEvents,
    который возвращает список событий подписчика
  • класс EventDispatcher,
    который управляет событиями и слушателями
  • метод dispatch,
    который запускает событие в диспетчере
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить