是否可以设置事件监听器(或做其他事情?)来监听所有 Symfony 2 AppKernel
应用程序针对特定请求触发的事件?
也就是说,我知道我可以使用app_dev.php
浏览应用程序并使用分析器查看所有侦听器的列表,但我有兴趣获取每个侦听器的列表已被调度/解雇的事件。我知道一些事件系统有一个特殊的全局/全部监听器,让我收到每个事件。我想知道Symfony是否有类似的东西,或者是否有另一种机制来获取特定页面上所有可用事件的列表。
我也知道我可以在其中一个事件调度程序类
中添加一些临时调试代码Symfony/Component/EventDispatcher/EventDispatcher.php
Symfony/Component/HttpKernel/Debug/ContainerAwareTraceableEventDispatcher.php
Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php
但我正在寻找一种不那么黑客/破坏性较小的东西。
Symfony的新手,但不是编程的新手。抱歉,如果这是一个天真的问题,但谷歌搜索没有揭示我所追求的。
答案 0 :(得分:6)
干净的方法是创建自己的EventDispatcher,它执行您的日志记录或事件发生时您尝试做的任何事情。请查看default one以了解其工作原理。
现在首先创建类
use Symfony\Component\EventDispatcher\EventDispatcher;
class MyDispatcher extends EventDispatcher
{
// sadly those properties aren't protected in EventDispatcher
private $listeners = array();
private $sorted = array();
public function dispatch($eventName, Event $event = null)
{
if (null === $event) {
$event = new Event();
}
$event->setDispatcher($this);
$event->setName($eventName);
// do something with the event here ... i.e. log it
if (!isset($this->listeners[$eventName])) {
return $event;
}
$this->doDispatch($this->getListeners($eventName), $eventName, $event);
return $event;
}
...然后将您的MyDispatcher注册为symfony的默认值。
(通过覆盖原始的event_dispatcher服务)
应用/配置/ config.yml 强>
services:
event_dispatcher:
class: Vendor\YourBundle\MyDispatcher
arguments: [@service_container]
...甚至更简单,只需覆盖创建服务时symfony使用的class parameter。
parameters:
event_dispatcher.class: Vendor\YourBundle\MyDispatcher