2013-06-25 13 views
6

E 'possibile impostare un listener di eventi (o fare -? Qualcos'altro) per l'ascolto di tutti gli eventi generati da uno Symfony 2 AppKernel domanda di una richiesta particolare?Ascoltare per tutti gli eventi in Symfony 2

Cioè, so che posso accedere a un'applicazione con app_dev.php e utilizzare il profiler per visualizzare un elenco di tutti gli ascoltatori , ma io sono interessato a catturare un elenco di ogni evento che è stato spedito/licenziato. So che alcuni sistemi di eventi hanno uno speciale globale/tutto l'ascoltatore che mi permetterebbe di ricevere ogni evento. Mi chiedo se Symfony abbia qualcosa di simile o se ci sia un altro meccanismo per ottenere un elenco di tutti gli eventi disponibili su una determinata pagina.

so anche che potrei aggiungere del codice di debug temporaneo per uno degli eventi classi Dispatcher

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

ma sto cercando qualcosa che è meno di un hack/meno distruttivo.

Nuovo per Symfony, ma non nuovo per la programmazione. Mi scuso se questa è una domanda ingenua, ma su Google non ha rivelato ciò che sto cercando.

risposta

6

Il modo pulito sarebbe creare il proprio EventDispatcher che esegue la registrazione o qualsiasi altra cosa si stia tentando di fare se si verifica un evento. Dai un'occhiata allo default one per avere un'idea di come funziona.

Ora prima creare la classe

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

... quindi registrare il MyDispatcher di default di symfony uno.

(sovrascrivendo il servizio event_dispatcher originale)

app/config/config.yml

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

... o ancora più semplice semplicemente ignorare il class parameter in uso da symfony durante la creazione del servizio .

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

Grazie - questo è esattamente quello che stavo cercando. Una domanda di follow-up che è per lo più fuori tema ma tangenziale. Il mio bundle cercherà automaticamente 'config_prod.yml',' config_dev.yml', etc, o spetterà a me fare in modo che il mio bundle lo faccia? –

+1

devi dire ai tuoi pacchetti quali file di configurazione caricare all'interno dell'estensione del bundle trovato in /DependencyInjection/BundleNameExtension.php. Il metodo 'load()' di questo file verrà eseguito automaticamente da symfony se il file è denominato correttamente. Non esiste una logica specifica per l'ambiente in questo naturalmente – nifr

Problemi correlati