2013-04-05 12 views
5

私は2つのバンドルを持つプログラムを持っています。そのうちの1人(CommonBundle)はイベント「common.add_channel」を送出し、もう一方のサービス(FetcherBundle)はそれを聞くことになっていました。プロファイラでは、「呼び出されていないリスナー」セクションにcommon.add_channelイベントが表示されます。私はsymfonyが私のリスナーを登録していない理由を知りません。symfony2がイベントリスナーを呼び出さないのはなぜですか?

これはCommonBundle\Controller\ChannelController::createActionの内側に、自分の行動です:

$dispatcher = new EventDispatcher(); 
$event = new AddChannelEvent($entity);   
$dispatcher->dispatch("common.add_channel", $event); 

これは私のAddChannelEvent次のとおりです。

<?php 

namespace Naroga\Reader\CommonBundle\Event; 

use Symfony\Component\EventDispatcher\Event; 
use Naroga\Reader\CommonBundle\Entity\Channel; 

class AddChannelEvent extends Event { 

    protected $_channel; 

    public function __construct(Channel $channel) { 
     $this->_channel = $channel; 
    } 

    public function getChannel() { 
     return $this->_channel; 
    } 

} 

これは私のリスナー(FetcherService.php)になるはずだった。

<?php 

namespace Naroga\Reader\FetcherBundle\Service; 

class FetcherService { 

    public function onAddChannel(AddChannelEvent $event) { 
     die("It's here!");  
    } 
} 

ここで私はリスナー(services.yml)を登録しています:

kernel.listener.add_channel: 
    class: Naroga\Reader\FetcherBundle\Service\FetcherService 
    tags: 
     - { name: kernel.event_listener, event: common.add_channel, method: onAddChannel } 

私は間違っていますか? common.add_channelをディスパッチするときにsymfonyがイベントリスナーを呼び出さないのはなぜですか?

+0

標準symfonyの質問:あなたはservices.ymlにリスナーを追加した後にキャッシュをクリアしたサービスを取得するには、Controller#get()ショートカットを使用できますか? –

+0

はい。必要ではありませんが、各ページでapp_dev.phpを使用している場合、services.ymlへの変更はキャッシュに再コンパイルされます。私は何度もそれをクリアしました。 –

答えて

12

新しいイベントディスパッチャは、別のディスパッチャで設定されたリスナーについては何も知らない。

コントローラでは、event_dispatcherサービスにアクセスする必要があります。 Framework Bundleのコンパイラ・パスにより、すべてのリスナーがこのディスパッチャに接続されました。

// ... 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class ChannelController extends Controller 
{ 
    public function createAction() 
    { 
     $dispatcher = $this->get('event_dispatcher'); 
     // ... 
    } 
} 
+0

それはそれでした。ありがとうございました:) –

+0

ありがとう、助けてもらえました –

+0

これはSymfony 2.3.4でも動作しますか?またはこれが変更されていますか? – Chausser

関連する問題