9

我正在尝试根据此处给出的示例设置一个简单的事件订阅 - 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)

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

4

2 回答 2

8

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

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

$dispatcher = new EventDispatcher();
$dispatcher->addSubscriber(new Subscriber());
$dispatcher->dispatch(EventStore::EVENT_SAMPLE);
于 2013-08-28T14:20:42.587 回答
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);

由于这个问题的答案,我已经调整了我的答案,即使两个问题的上下文不同,答案仍然适用。

于 2013-08-28T13:59:05.307 回答