2016-03-24 6 views
1

にリスナーを追加: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']); 

次に、リスナーが呼び出されているのがわかります。

私の質問:

は、サービス宣言のディスパッチャにリスナーを追加する方法はありますか? スクリプトにリスナーを認識させたくありません。イベントが発生したときにEventListenerは、このメソッドを呼び出すようにするには

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のタグで

答えて

1

は、onUserActivationmethod属性を設定します。あなたがタグ名kernel.event_listener使用することも必要

EDIT

:より多くの情報
ため

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を(「サービスコンテナでのイベントリスナーの登録」と呼ばれる段落があります)。

+0

実際、私はkernel.event_listenerが欠落していましたが、イベントの後に(私のケースではonMyAppUserActivation)名前が付いていれば、メソッドは必須ではありませんでしたが、my_app.event_listenerの代わりにmy_app.event_listenerなどのカスタム名を使用することを望んでいました。 kernel.event_listener :( – jiboulex

+0

右のように、イベント名のような名前を付けているので、 'method'は必須ではありません。リスナーのタグ名は、組み込みのタグ名に基づいています。あなたの答えをありがとう! – chalasr

+0

大丈夫ですか? – jiboulex

関連する問題