2016-04-28 8 views
1

カスタムイベントディスパッチャとサブスクライバを作成しているので、私は自分の頭を包み込みたいと思っています。カスタムイベントがディスパッチされない理由を知ることができます。 。Symfony - イベントがディスパッチされていない

私はdocumentationに従っています。私の場合は、誰かがサイトに登録するとすぐにイベントを送信する必要があります。その内部

registerAction()私はこれが行った後、私のRegistrationSubscriberクラス

namespace AppBundle\Event;  
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\HttpKernel\Event\FilterResponseEvent; 
use Symfony\Component\HttpKernel\KernelEvents; 

class RegistrationSubscriber implements EventSubscriberInterface 
{ 
    public static function getSubscribedEvents() 
    { 
     return array(
      KernelEvents::RESPONSE => array(
       array('onKernelResponsePre', 10), 
       array('onKernelResponsePost', -10), 
      ), 
      RegistrationEvent::NAME => 'onRegistration' 
     ); 

    } 
    public function onKernelResponsePre(FilterResponseEvent $event) 
    { 
     // ... 
    } 

    public function onKernelResponsePost(FilterResponseEvent $event) 
    { 
     // ... 
    } 
    public function onRegistration(RegistrationEvent $event){ 

     var_dump($event); 
     die; 

    } 

} 

である。これは私のRegistrationEventクラス

namespace AppBundle\Event; 
use AppBundle\Entity\User; 
use Symfony\Component\EventDispatcher\Event; 

class RegistrationEvent extends Event 
{ 
    const NAME = 'registration.complete'; 

    protected $user; 

    public function __construct(User $user) 
    { 
     $this->user = $user; 
    } 

    public function getUser(){ 
     return $this->user; 
    } 

} 

あるこの

$dispatcher = new EventDispatcher(); 
$event = new RegistrationEvent($user); 
$dispatcher->dispatch(RegistrationEvent::NAME, $event); 

のようなイベントを送出しようとしていますこれは、私は登録pr odoは関数onRegistrationで停止しますが、それは起こりませんでした。プロファイラの[イベント]タブを見て、私のイベントがリストされているのを見ていません。

私はここで何が欠けていますか?正しい方向へのプッシュは本当に感謝されます。

アップデート:私は、プロファイラの[イベント]タブ内services.yml

app.successfull_registration_subscriber: 
    class: AppBundle\Event\RegistrationSubscriber 
    arguments: ["@doctrine.orm.entity_manager"] 
    tags: 
     - { name: kernel.event_subscriber} 

の内側に次のコードを追加しましたので 私は私のカスタムイベントがリストされ参照してくださいか、私はカスタムイベントのためにサービスを登録する必要があります考えしかしそれはまだ発送しません。

答えて

1

独自のEventDispatcherインスタンスを作成することで、他のリスナーが聞くことのできない(このディスパッチャインスタンスには接続されていない)イベントを送出します。あなたはkernel.event_listenerkernel.event_subscriberタグでタグ付けされたすべてのリスナーに通知するためにevent_dispatcherサービスを使用する必要があります。

// ... 

class RegistrationController extends Controller 
{ 
    public function registerAction() 
    { 
     // ... 

     $this->get('event_dispatcher')->dispatch(RegistrationEvent::NAME, new RegistrationEvent($user);); 
    } 
} 
+0

私の理解が正しければ、それは今:)働かせた多くのおかげで、私は派遣する必要があるたびに、カスタムイベント私は物理的にコントローラーやサービスの異なるアクションに何度も繰り返しコードを書く必要があります。答えがイエスならば、手動でディスパッチするのではなく、どのイベントを自動的にすべてのリスナーが利用できるようにするのですか?私は自分の質問が理にかなってくれることを願っています。 – Saadia

+0

質問は、あなたが派遣しなければイベントが起こったことをあなたのリスナーがどのように知るべきですか?あなたがする必要はありませんが、常にコントローラからイベントディスパッチャをフェッチすることです。たとえば、サービスをコンフィグレーションするときに、他の依存関係をインジェクトするのと同じように、イベントディスパッチャをイベントハンドラに挿入することができます。 – xabbuh

関連する問題