7

我有一个包含两个捆绑包的程序。其中一个(CommonBundle)调度一个事件“common.add_channel”,而另一个(FetcherBundle)上的服务应该正在监听它。在分析器上,我可以在“未调用的侦听器”部分看到事件 common.add_channel。我不明白为什么 symfony 没有注册我的听众。

这是我的行动,里面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 不调用事件监听器?

4

1 回答 1

14

新的事件分派器对另一个分派器上设置的侦听器一无所知。

在您的控制器中,您需要访问该event_dispatcher服务。Framework Bundle 的 Compiler Pass 将所有侦听器附加到此调度程序。要获取服务,请使用Controller#get()快捷方式:

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

class ChannelController extends Controller
{
    public function createAction()
    {
        $dispatcher = $this->get('event_dispatcher');
        // ...
    }
}
于 2013-04-05T21:33:47.890 回答