Symfony2: автоматическое добавление слушателя в диспетчер

Я хочу прослушать пользовательское событие, которое я создал:

Вот это событие:

class UserActivationEvent extends Event
{
const NAME = 'my_app.user.activation';
}

У меня есть диспетчер событий благодаря следующему сервису:

event_dispatcher:
class: Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher
arguments:
- "@service_container"

Я отправляю свое событие в моем коде:

$dispatcher = $this->get('event_dispatcher');
$event = new UserActivationEvent();
$dispatcher->dispatch(UserActivationEvent::NAME, $event);

Я создал слушателя:

class UserActivationListener
{
public function onUserActivation($event)
{
var_dump('I am listening'); exit();
}
}

что я зарегистрировался как сервис:

my_app.legacy.listener.user_activation:
class: Acme\LegacyBundle\EventListener\UserActivationListener
tags:
- { name: my_app.event_listener, event: my_app.user.activation }

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

$listener = new UserActivationListener();
$this->dispatcher->addListener(UserActivationEvent::NAME, [$listener, 'onUserActivation']);

Тогда я вижу, что слушатель называется.

Мой вопрос :

Есть ли способ добавить слушатель к диспетчеру в объявлении сервиса?
Я не хочу, чтобы мой сценарий был в курсе слушателей.

1

Решение

В теге вашего EventListener, установить method приписывать onUserActivation:

my_app.legacy.listener.user_activation:
class: Acme\LegacyBundle\EventListener\UserActivationListener
tags:
- { name: my_app.event_listener, event: my_app.user.activation method: onUserActivation }

Чтобы сделать EventListener Вызов этого метода при возникновении события.

РЕДАКТИРОВАТЬ

Вам также необходимо использовать имя тега kernel.event_listener:

my_app.legacy.listener.user_activation:
class: Acme\LegacyBundle\EventListener\UserActivationListener
tags:
- { name: kernel.event_listener, event: my_app.user.activation method: onUserActivation }

Читать эта глава документации для получения дополнительной информации
(есть параграф «Регистрация прослушивателей событий в служебном контейнере»).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]