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