Symfony2事件订阅者不会调用侦听器

时间:2013-08-28 13:38:17

标签: symfony event-handling

我正在尝试根据此处给出的示例设置一个简单的事件订阅 - http://symfony.com/doc/master/components/event_dispatcher/introduction.html

这是我的活动商店:

namespace CookBook\InheritanceBundle\Event;

final class EventStore
{
    const EVENT_SAMPLE = 'event.sample';
}

这是我的活动订阅者:

namespace CookBook\InheritanceBundle\Event;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\Event;

class Subscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        var_dump('here');
        return array(
                'event.sample' => array(
                        array('sampleMethod1', 10),
                        array('sampleMethod2', 5)
                ));
    }

    public function sampleMethod1(Event $event)
    {
        var_dump('Method 1');
    }

    public function sampleMethod2(Event $event)
    {
        var_dump('Method 2');
    }
}

这是services.yml中的配置:

kernel.subscriber.subscriber:
    class: CookBook\InheritanceBundle\Event\Subscriber
    tags:
        - {name:kernel.event_subscriber}

以下是我举办活动的方式:

use Symfony\Component\EventDispatcher\EventDispatcher;
use CookBook\InheritanceBundle\Event\EventStore;
$dispatcher = new EventDispatcher();
$dispatcher->dispatch(EventStore::EVENT_SAMPLE);

预期产出:

string 'here' (length=4)
string 'Method 1' (length=8)
string 'Method 2' (length=8)

实际输出:

string 'here' (length=4)

由于某种原因,不会调用侦听器方法。谁知道这段代码有什么问题?感谢。

2 个答案:

答案 0 :(得分:8)

@Tristan说的话。服务文件中的标记部分是Symfony Bundle的一部分,只有在您将调度程序从容器中拉出时才会处理。

如果您这样做,您的示例将按预期工作:

$dispatcher = new EventDispatcher();
$dispatcher->addSubscriber(new Subscriber());
$dispatcher->dispatch(EventStore::EVENT_SAMPLE);

答案 1 :(得分:7)

您可能会尝试注入已配置的EventDispatcher@event_dispatcher),而不是实例化新的new EventDispatcher

如果你只创建它并添加一个事件监听器,Symfony仍然没有引用这个新创建的EventDispatcher对象,也不会使用它。

如果您在扩展ContainerAware的控制器内部:

use Symfony\Component\EventDispatcher\EventDispatcher;
use CookBook\InheritanceBundle\Event\EventStore;

...

$dispatcher = $this->getContainer()->get('event_dispatcher');
$dispatcher->dispatch(EventStore::EVENT_SAMPLE);

我已经根据this question's answer调整了我的答案,即使这两个问题的背景不同,答案仍然适用。