我正在尝试根据此处给出的示例设置一个简单的事件订阅 - 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)
由于某种原因,不会调用侦听器方法。谁知道这段代码有什么问题?感谢。
答案 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调整了我的答案,即使这两个问题的背景不同,答案仍然适用。