如果有的话,Symfony 2 捆绑开发人员应该如何使用随 Symfony 2 系统一起提供的事件调度程序?
我一直在挖掘 Symfony 事件调度程序的源代码,我所看到的一些内容让我有点困惑,作为第三方包创建者,我应该如何使用 Symfony 附带的事件调度程序。
具体来说,我注意到一个股票 Symfony 系统有 两个 事件调度程序服务。 event_dispatcher
和 debug.event_dispatcher
。 HttpKernel 使用哪个服务取决于环境,并由生成的 dev 或 prod 容器文件驱动。
//dev kernel instantiation uses `debug.event_dispatcher` service
new \Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel(
$this->get('debug.event_dispatcher'),
$this,
$this->get('debug.controller_resolver')
);
//prod kernel instantiation uses `event_dispatcher` service
new \Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel(
$this->get('event_dispatcher'),
$this,
new \Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver($this, $this->get('controller_name_converter'), $this->get('monolog.logger.request', ContainerInterface::NULL_ON_INVALID_REFERENCE)));
到目前为止,这一切都是有道理的——因为它是
debug.event_dispatcher
实现了 web 配置文件的事件选项卡中的功能,包括查看哪些监听器被调用以及哪些监听器未被调用的能力。但是,我注意到大多数(如果不是全部)第三方包使用硬编码的
event_dispatcher
服务调用。例如JMS/JobQueueBundle使用如下$this->dispatcher = $this->getContainer()->get('event_dispatcher');
像这样触发的事件正确触发, 但
debug.event_dispatcher
不知道它们,这意味着 Symfony Web 分析器会错误地将调用的监听器列为未调用的。此外,尚不清楚包作者如何避免这种情况,因为他们没有生成容器文件 和 的优势,HTTP 内核对象不会公开 protected 调度程序对象的访问器。那么,这是 Symfony 中的错误吗?
还是
event_dispatcher
服务仅用于内核事件,这意味着所有这些包作者都在滥用它?或者(最有可能的候选人)是我遗漏或没有考虑过的其他事情吗?
最佳答案
看起来我上面描述的场景不适用于最新版本的 Symfony ( 2.4.1
)。具体来说,在 2.4.1
中,生成的app容器文件
app/cache/dev/appDevDebugProjectContainer.php
包含以下内容
$this->aliases = array(
//...
'event_dispatcher' => 'debug.event_dispatcher',
//...
);
也就是说,与我正在处理的 Symfony
2.3.6
项目不同,event_dispatcher
服务已被别名为 debug.event_dispatcher
服务(当 Symfony 在开发模式下运行时)。这意味着当其他包在开发模式下请求 event_dispatcher
服务时,他们实际上得到的是 debug.event_dispatcher
服务。这让 debug.event_dispatcher
知道所有事件,并且它可以正确报告哪些事件被调度。虽然这不是一个具体的答案,但它确实表明 Symfony 团队已经/已经意识到这个问题,这让我相信 Bundle 开发人员打算在他们自己的事件中使用
event_dispatch
服务。关于php - 使用 Symfony 2 事件调度器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21175119/