2013-06-25 14 views
6

Czy jest możliwe ustawienie detektora zdarzeń (lub zrobić - coś innego?) Do nasłuchiwania zdarzeń wywołanych przez aplikację Symfony 2 AppKernel dla konkretnego żądania?Posłuchaj wszystkich wydarzeń w Symfony 2

To znaczy, wiem, że mogę przeglądać aplikację z app_dev.php i użyj profilera aby wyświetlić listę wszystkich słuchaczy, ale jestem zainteresowany chwytając listę każdego zdarzenia, które zostało wysłane/zwolniony. Wiem, że niektóre systemy zdarzeń mają specjalnego globalnego/wszystkich słuchaczy, co pozwoliłoby mi otrzymywać każde wydarzenie. Zastanawiam się, czy Symfony ma coś podobnego, czy istnieje inny mechanizm, aby uzyskać listę wszystkich dostępnych zdarzeń na danej stronie.

wiem też mogę dodać trochę tymczasowego kodu do jednego zdarzenia dyspozytora klas

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

ale szukam czegoś, co jest mniej hack/mniej destrukcyjne.

Nowy w Symfony, ale nie nowy w programowaniu. Przepraszam, jeśli jest to naiwne pytanie, ale szukanie w Google nie ujawniło, o co mi chodzi.

Odpowiedz

6

W czysty sposób utworzysz własny EventDispatcher, który wykona rejestrację lub cokolwiek chcesz zrobić, jeśli wystąpi zdarzenie. Spójrz na numer default one, aby dowiedzieć się, jak to działa.

Teraz najpierw utworzyć klasę

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

... następnie zarejestrować MyDispatcher jako domyślny symfony.

(przez nadpisanie oryginalnego usługę event_dispatcher)

app/config/config.yml

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

... albo jeszcze prościej przesłonić class parameter używany przez symfony podczas tworzenia usługi .

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

Dzięki - właśnie tego szukałem. Jedno pytanie uzupełniające, które najczęściej dotyczy tematu, ale jest styczne. Czy mój pakiet będzie automatycznie szukał 'config_prod.yml',' config_dev.yml', etc, czy też byłoby to możliwe, aby mój pakiet robił to? –

+1

musisz poinformować swoje pakiety, które pliki konfiguracyjne mają załadować wewnątrz rozszerzenia pakietu znalezionego w /DependencyInjection/BundleNameExtension.php. Metoda 'load()' tego pliku zostanie automatycznie wykonana przez symfony, jeśli plik zostanie nazwany poprawnie. Tam naturalnie nie ma naturalnej logiki – nifr