2016-03-24 4 views
1

ich zu einem benutzerdefinierten Ereignis hören möchte ich erstellt:Symfony2: automatisch das Hinzufügen eines Zuhörers zu einem Dispatcher

Hier ist die Veranstaltung:

class UserActivationEvent extends Event 
{ 
    const NAME = 'my_app.user.activation'; 
} 

ich einen Event-Dispatcher dank der folgenden Service haben:

event_dispatcher: 
    class: Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher 
    arguments: 
     - "@service_container" 

ich versende meine Veranstaltung in meinem Code:

$dispatcher = $this->get('event_dispatcher'); 
$event = new UserActivationEvent(); 
$dispatcher->dispatch(UserActivationEvent::NAME, $event); 

Ich habe einen Zuhörer:

class UserActivationListener 
{ 
    public function onUserActivation($event) 
    { 
     var_dump('I am listening'); exit(); 
    } 
} 

, die ich als Dienst registriert:

my_app.legacy.listener.user_activation: 
    class: Acme\LegacyBundle\EventListener\UserActivationListener 
    tags: 
     - { name: my_app.event_listener, event: my_app.user.activation } 

Aber dieser Code löst nicht meine Zuhörer. Ich bin Kraft, um die folgenden Zeilen in meinem Skript hinzuzufügen:

Dann kann ich sehen, der Hörer heißt.

Meine Frage:

Gibt es eine Möglichkeit, einen Zuhörer an einen Dispatcher in der Service Erklärung hinzufügen? Ich möchte nicht, dass mein Skript die Zuhörer kennt.

Antwort

1

In dem Tag Ihrer EventListener, setzen Sie das method Attribut onUserActivation:

my_app.legacy.listener.user_activation: 
    class: Acme\LegacyBundle\EventListener\UserActivationListener 
    tags: 
     - { name: my_app.event_listener, event: my_app.user.activation method: onUserActivation } 

Um die EventListener Aufruf dieser Methode, wenn das Ereignis ausgelöst wird.

EDIT

Sie müssen auch den Tag-Namen kernel.event_listener verwenden: für weitere Informationen

my_app.legacy.listener.user_activation: 
    class: Acme\LegacyBundle\EventListener\UserActivationListener 
    tags: 
     - { name: kernel.event_listener, event: my_app.user.activation method: onUserActivation } 

lesen this documentation chapter
(es gibt einen Absatz "Registrieren Ereignis-Listener im Service-Container" genannt).

+0

Ja tatsächlich fehlte mir nur der kernel.event_listener, aber die Methode ist nicht obligatorisch, wenn sie nach dem Ereignis benannt ist (in meinem Fall onMyAppUserActivation) .. aber ich hoffte, einen benutzerdefinierten Namen wie my_app.event_listener zu verwenden kernel.event_listener :( – jiboulex

+0

Richtig, ich sehe nur, dass Sie die Methode wie den Namen des Ereignisses benennen, also ist die Methode nicht zwingend. Für den Listener-Tag-Namen ist es etwas, das auf eingebauten Tag-Namen basiert und nicht kann Gewohnheit ohne viele Überschreibungen – chalasr

+0

gut danke für Ihre Antworten! – jiboulex

Verwandte Themen