2013-06-25 7 views
6

Ist es möglich, einen Ereignis-Listener einzurichten (oder etwas anderes zu tun?), Um für alle die Ereignisse abzuhören, die von einer Symfony 2 AppKernel-Anwendung für eine bestimmte Anforderung ausgelöst werden?Für alle Veranstaltungen in Symfony 2 anhören

Das heißt, ich weiß, ich eine Anwendung mit app_dev.php blättern und den Profiler verwenden, um eine Liste aller Zuhörer sehen, aber ich bin daran interessiert, eine Liste von jedem Ereignis in Grabbing, die versandt/abgefeuert worden ist. Ich weiß, dass einige Event-Systeme einen speziellen Global/All-Listener haben, damit ich jedes Event empfangen kann. Ich frage mich, ob Symfony etwas Ähnliches hat oder ob es einen anderen Mechanismus gibt, um eine Liste aller verfügbaren Ereignisse auf einer bestimmten Seite zu erhalten.

Ich weiß auch, einig temporären Debugging-Code zu einem der Event-Dispatcher-Klassen hinzufügen

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

ich könnte, aber ich bin auf der Suche nach etwas, das weniger von einem Hack/weniger destruktiv ist.

Neu bei Symfony, aber nicht neu bei der Programmierung. Entschuldigung, wenn das eine naive Frage ist, aber das Googlen hat nicht offenbart, wonach ich suche.

Antwort

6

Der saubere Weg wäre, Ihren eigenen EventDispatcher zu erstellen, der Ihre Protokollierung ausführt oder was auch immer Sie versuchen, wenn ein Ereignis auftritt. Werfen Sie einen Blick auf die default one, um eine Vorstellung davon zu bekommen, wie es funktioniert.

Erstellen Sie nun zuerst die Klasse

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; 
    } 

... dann MyDispatcher als symfonys ein Standard registrieren.

(durch den ursprünglichen event_dispatcher Service überschreiben)

app/config/config.yml

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

... oder noch einfacher außer Kraft setzen nur die class parameter von symfony den Dienst zu schaffen, wenn verwendet wird, .

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

Danke - das ist genau das, was ich gesucht habe. Eine Follow-up-Frage, die meist nicht Thema ist, sondern tangential. Wird mein Paket automatisch nach 'config_prod.yml',' config_dev.yml' usw. suchen, oder würde es an mir liegen, das Paket zu machen? –

+1

müssen Sie Ihren Bundles mitteilen, welche Konfigurationsdateien in der Erweiterung des Bundles geladen werden sollen, die in /DependencyInjection/BundleNameExtension.php gefunden wird. Die 'load()' Methode dieser Datei wird von Symfony automatisch ausgeführt, wenn die Datei korrekt benannt ist. Es gibt natürlich keine umweltspezifische Logik – nifr