2013-06-25 80 views
6

是否可以設置事件偵聽器(或者做其他事情?)來偵聽由Symfony 2 AppKernel應用程序針對特定請求觸發的事件全部收聽Symfony 2中的所有事件

也就是說,我知道我可以app_dev.php瀏覽應用程序,並使用Profiler來查看所有聽衆的名單,但我感興趣的是抓住每一個已經派出/解僱事件的列表。我知道一些事件系統有一個特殊的全局/所有的監聽器,它可以讓我接收每一個事件。我想知道Symfony是否有類似的東西,或者是否有另一種機制來獲取特定頁面上所有可用事件的列表。

我也知道我可以添加一些臨時調試代碼到事件的一個調度類

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

但我正在尋找的東西,就是少了黑客/更少破壞性的。

Symfony的新手,但對編程並不陌生。道歉,如果這是一個天真的問題,但谷歌搜索沒有透露我後。

回答

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] 

...甚至只是簡單重寫class parameter正在使用的symfony創建服務時。

parameters: 
    event_dispatcher.class: Vendor\YourBundle\MyDispatcher 
+0

謝謝 - 這正是我一直在尋找的。一個跟進的問題主要是關於主題而非切題。我的包是否會自動查找'config_prod.yml','config_dev.yml'等,還是由我來讓我的包做到這一點? –

+1

你必須告訴你的軟件包在 /DependencyInjection/BundleNameExtension.php找到的軟件包擴展中加載哪些配置文件。如果文件命名正確,該文件的'load()'方法將由symfony自動執行。那裏自然沒有環境特定的邏輯 – nifr