にリスナーを追加: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
のタグで
実際、私はkernel.event_listenerが欠落していましたが、イベントの後に(私のケースではonMyAppUserActivation)名前が付いていれば、メソッドは必須ではありませんでしたが、my_app.event_listenerの代わりにmy_app.event_listenerなどのカスタム名を使用することを望んでいました。 kernel.event_listener :( – jiboulex
右のように、イベント名のような名前を付けているので、 'method'は必須ではありません。リスナーのタグ名は、組み込みのタグ名に基づいています。あなたの答えをありがとう! – chalasr
大丈夫ですか? – jiboulex