私は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がイベントリスナーを呼び出さないのはなぜですか?
標準symfonyの質問:あなたはservices.ymlにリスナーを追加した後にキャッシュをクリアしたサービスを取得するには、
Controller#get()
ショートカットを使用できますか? –はい。必要ではありませんが、各ページでapp_dev.phpを使用している場合、services.ymlへの変更はキャッシュに再コンパイルされます。私は何度もそれをクリアしました。 –