Php 收听Symfony 2中的所有事件

Php 收听Symfony 2中的所有事件,php,events,symfony,Php,Events,Symfony,是否可以设置事件侦听器(或执行其他操作?)来侦听Symfony 2AppKernel应用程序为特定请求触发的所有事件 也就是说,我知道我可以使用app_dev.php浏览应用程序,并使用探查器查看所有侦听器的列表,但我感兴趣的是获取已调度/触发的每个事件的列表。我知道一些事件系统有一个特殊的全局/全部侦听器,它可以让我接收每个事件。我想知道Symfony是否有类似的功能,或者是否有其他机制可以获取特定页面上所有可用事件的列表 我还知道我可以向其中一个事件调度器类添加一些临时调试代码 Symfon

是否可以设置事件侦听器(或执行其他操作?)来侦听Symfony 2
AppKernel
应用程序为特定请求触发的所有事件

也就是说,我知道我可以使用
app_dev.php
浏览应用程序,并使用探查器查看所有侦听器的列表,但我感兴趣的是获取已调度/触发的每个事件的列表。我知道一些事件系统有一个特殊的全局/全部侦听器,它可以让我接收每个事件。我想知道Symfony是否有类似的功能,或者是否有其他机制可以获取特定页面上所有可用事件的列表

我还知道我可以向其中一个事件调度器类添加一些临时调试代码

Symfony/Component/EventDispatcher/EventDispatcher.php
Symfony/Component/HttpKernel/Debug/ContainerAwareTraceableEventDispatcher.php
Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php
但我正在寻找一种不那么骇人/破坏性更小的东西


Symfony的新功能,但对编程并不陌生。如果这是一个幼稚的问题,我表示歉意,但谷歌搜索并没有透露我想要什么

干净的方法是创建您自己的EventDispatcher,在事件发生时执行日志记录或您尝试执行的任何操作。请看一下,以了解其工作原理

现在首先创建类

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的默认Dispatcher

(通过覆盖原始事件调度器服务)

app/config/config.yml

services:
    event_dispatcher:
        class: Vendor\YourBundle\MyDispatcher
        arguments: [@service_container]
。。。或者更简单的方法是在创建服务时覆盖symfony正在使用的

parameters:
    event_dispatcher.class: Vendor\YourBundle\MyDispatcher

谢谢-这正是我想要的。一个跟进问题,大部分都是离题的,但与主题无关。我的捆绑包是否会自动查找
config_prod.yml
config_dev.yml
等,还是由我来让我的捆绑包执行此操作?您必须告诉捆绑包在/DependencyInjection/BundleNameExtension.php中找到的捆绑包扩展名中加载哪些配置文件。如果文件名正确,symfony将自动执行该文件的
load()
方法。其中自然没有特定于环境的逻辑