收听Symfony 2中的所有活动

时间:2013-06-25 16:19:41

标签: php events symfony

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

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

我也知道我可以在其中一个事件调度程序类

中添加一些临时调试代码
Symfony/Component/EventDispatcher/EventDispatcher.php
Symfony/Component/HttpKernel/Debug/ContainerAwareTraceableEventDispatcher.php
Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php

但我正在寻找一种不那么黑客/破坏性较小的东西。

Symfony的新手,但不是编程的新手。抱歉,如果这是一个天真的问题,但谷歌搜索没有揭示我所追求的。

1 个答案:

答案 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