6

是否可以设置一个事件侦听器(或做其他事情?)来侦听Symfony 2应用程序针对特定请求触发的所有事件?AppKernel

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

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

Symfony/Component/EventDispatcher/EventDispatcher.php
Symfony/Component/HttpKernel/Debug/ContainerAwareTraceableEventDispatcher.php
Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php

但我正在寻找一种不那么具有破坏性/破坏性的东西。

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

4

1 回答 1

6

干净的方法是创建您自己的 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 的默认值。

(通过覆盖原来的 event_dispatcher 服务)

应用程序/配置/config.yml

services:
    event_dispatcher:
        class: Vendor\YourBundle\MyDispatcher
        arguments: [@service_container]

... 或者更简单的是在创建服务时覆盖 symfony 使用的类参数。

parameters:
    event_dispatcher.class: Vendor\YourBundle\MyDispatcher
于 2013-06-25T16:38:08.813 回答