Класс 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,
который запускает событие в диспетчере