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



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

这是我的活动商店:

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

这是我的活动订阅者:

namespace CookBookInheritanceBundleEvent;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
use SymfonyComponentEventDispatcherEvent;
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: CookBookInheritanceBundleEventSubscriber
    tags:
        - {name:kernel.event_subscriber}

以下是我提出这一事件的方式:

use SymfonyComponentEventDispatcherEventDispatcher;
use CookBookInheritanceBundleEventEventStore;
$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)

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

@Tristan说了什么。服务文件中的标记部分是Symfony Bundle的一部分,只有当您将调度器从容器中拉出时才会进行处理。

如果你这样做,你的例子会像预期的那样起作用:

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

您可以尝试注入已配置的EventDispatcher@event_dispatcher),而不是安装新的(new EventDispatcher

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

如果您在扩展ContainerWare:的控制器中

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

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

相关内容

  • 没有找到相关文章

最新更新