簡體   English   中英

Symfony2:自動向調度程序添加偵聽器

[英]Symfony2 : automatically adding a listener to a dispatcher

我想收聽我創建的自定義事件:

這是事件:

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']);

然后我可以看到監聽器被調用。

我的問題 :

有沒有辦法在服務聲明中向調度程序添加偵聽器? 我不希望我的腳本知道聽眾。

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 }

閱讀本文檔章節以獲取更多信息
(有一段叫做“在服務容器中注冊事件監聽器”)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM