Symfony2:自动将监听器添加到调度程序

时间:2016-03-24 14:23:42

标签: php symfony dispatcher event-listener

我想听我创建的自定义事件:

以下是活动:

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 个答案:

答案 0 :(得分: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 }

阅读this documentation chapter了解更多信息
(有一段名为"在服务容器中注册事件监听器")。