Метод addSubscriber
Метод addSubscriber класса EventDispatcher
добавляет в диспетчер подписчика событий.
Первым параметром передаётся объект, реализующий
интерфейс EventSubscriberInterface. Диспетчер
читает список событий через метод getSubscribedEvents
и автоматически регистрирует все обработчики подписчика.
Синтаксис
public function addSubscriber(EventSubscriberInterface $subscriber): void
Пример
Давайте создадим подписчика, который слушает событие 'user.created':
<?php
namespace AppEvent;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
use SymfonyContractsEventDispatcherEvent;
class UserSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
'user.created' => 'onUserCreated',
];
}
public function onUserCreated(Event $event): void
{
echo 'user created';
}
}
?>
Теперь зарегистрируем подписчика в диспетчере:
<?php
namespace AppController;
use AppEventUserSubscriber;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentEventDispatcherEventDispatcher;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function index(): Response
{
$dispatcher = new EventDispatcher();
$dispatcher->addSubscriber(new UserSubscriber());
$dispatcher->dispatch(new Event(), 'user.created');
return new Response('done');
}
}
?>
Результат выполнения кода:
"user created"
Пример
Давайте подпишем одного подписчика сразу на несколько событий:
<?php
namespace AppEvent;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
use SymfonyContractsEventDispatcherEvent;
class ArticleSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
'article.created' => 'onCreated',
'article.deleted' => 'onDeleted',
];
}
public function onCreated(Event $event): void
{
echo 'created';
}
public function onDeleted(Event $event): void
{
echo 'deleted';
}
}
?>
Зарегистрируем подписчика и вызовем оба события:
<?php
namespace AppController;
use AppEventArticleSubscriber;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentEventDispatcherEventDispatcher;
use SymfonyComponentHttpFoundationResponse;
use SymfonyContractsEventDispatcherEvent;
class ArticleController extends AbstractController
{
public function index(): Response
{
$dispatcher = new EventDispatcher();
$dispatcher->addSubscriber(new ArticleSubscriber());
$dispatcher->dispatch(new Event(), 'article.created');
$dispatcher->dispatch(new Event(), 'article.deleted');
return new Response('done');
}
}
?>
Результат выполнения кода:
"createddeleted"
Смотрите также
-
класс
EventDispatcher,
который управляет событиями и слушателями -
метод
dispatch,
который запускает событие по имени -
метод
addListener,
который регистрирует одиночный обработчик события -
интерфейс
EventSubscriber,
который описывает подписчика событий