2013-08-28 15 views
9

Próbuję skonfigurować subskrypcję prostego zdarzenia na podstawie podanego tu przykładu - http://symfony.com/doc/master/components/event_dispatcher/introduction.html.Subskrybent zdarzeń Symfony2 nie wywołuje detektorów

Oto mój sklep wydarzenie:

namespace CookBook\InheritanceBundle\Event; 

final class EventStore 
{ 
    const EVENT_SAMPLE = 'event.sample'; 
} 

Oto mój abonent wydarzenie:

namespace CookBook\InheritanceBundle\Event; 

use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\EventDispatcher\Event; 

class Subscriber implements EventSubscriberInterface 
{ 
    public static function getSubscribedEvents() 
    { 
     var_dump('here'); 
     return array(
       'event.sample' => array(
         array('sampleMethod1', 10), 
         array('sampleMethod2', 5) 
       )); 
    } 

    public function sampleMethod1(Event $event) 
    { 
     var_dump('Method 1'); 
    } 

    public function sampleMethod2(Event $event) 
    { 
     var_dump('Method 2'); 
    } 
} 

Oto config w services.yml:

kernel.subscriber.subscriber: 
    class: CookBook\InheritanceBundle\Event\Subscriber 
    tags: 
     - {name:kernel.event_subscriber} 

A oto w jaki sposób podnieść zdarzenia :

use Symfony\Component\EventDispatcher\EventDispatcher; 
use CookBook\InheritanceBundle\Event\EventStore; 
$dispatcher = new EventDispatcher(); 
$dispatcher->dispatch(EventStore::EVENT_SAMPLE); 

wyjście z oczekiwaniami:

string 'here' (length=4) 
string 'Method 1' (length=8) 
string 'Method 2' (length=8) 

Rzeczywista moc:

string 'here' (length=4) 

Z jakiegoś powodu, metody słuchacz nie sprawdzony. Ktoś wie, co jest nie tak z tym kodem? Dzięki.

Odpowiedz

7

Można próbować wstrzykiwać skonfigurowany EventDispatcher (@event_dispatcher) zamiast instanciating nowy (new EventDispatcher)

Jeśli tylko go utworzyć i dodać wydarzenie-słuchacza Symfony nadal ma żadnego odniesienia do tego nowo utworzonego EventDispatcher obiektu i nie użyje go.

Jeśli jesteś wewnątrz kontrolera, który rozciąga ContainerAware:

use Symfony\Component\EventDispatcher\EventDispatcher; 
use CookBook\InheritanceBundle\Event\EventStore; 

... 

$dispatcher = $this->getContainer()->get('event_dispatcher'); 
$dispatcher->dispatch(EventStore::EVENT_SAMPLE); 

Mam dostosowany moja odpowiedź dzięki this question's answer chociaż kontekst oba pytania są różne, stosuje się nadal odpowiedzią.

+0

Cheers Tristan. Muszę ponownie przejrzeć moje zrozumienie wstrzyknięcia zależności w symfony. – Prathap

+3

Widzę cię mniej więcej po skopiowaniu wklejonej mojej odpowiedzi [tutaj] (http://stackoverflow.com/questions/17671825/how-to-take-advantage-of-kernel-terminate-inside-an-event-listener) na własne pytanie bez odniesienia się do niego tutaj - proszę dać powód do oryginalnej korespondencji następnym razem :) – nifr

+0

Tak, całkowicie się nie połączyłem, ponieważ kontekst był inny, dla mnie byłem już w słuchaczu, więc bałem się tego wprowadziłoby to zamieszanie. Ale twoja odpowiedź całkowicie dotyczy tego pytania. –

8

Co @ Tristan powiedział. Część tagów w twoim pliku usług jest częścią pakietu Symfony i jest przetwarzana tylko wtedy, gdy usuniesz dyspozytora z kontenera.

Wasz przykład będzie działać zgodnie z oczekiwaniami, jeśli to zrobić:

$dispatcher = new EventDispatcher(); 
$dispatcher->addSubscriber(new Subscriber()); 
$dispatcher->dispatch(EventStore::EVENT_SAMPLE); 
+0

Pozdrawiam, Cerad. Szukałem zastrzyku z pliku konfiguracyjnego, który właśnie przedstawił Tristan. – Prathap

+2

W pełni rozumiem. @ Tristan zasługuje na kredyt. To było bardziej do udokumentowania, dlaczego działa z pojemnika, w przeciwieństwie do opublikowanego kodu. – Cerad

Powiązane problemy