2016-04-28 22 views
1

Dies ist das erste Mal, dass ich mit der Erstellung von benutzerdefinierten Ereignis Dispatcher und Abonnenten arbeiten, so versuche ich, meinen Kopf um mich zu wickeln und ich kann nicht herausfinden, warum meine benutzerdefinierte Ereignis nicht gesendet wird .Symfony - Ereignis wird nicht gesendet

Ich folge der documentation und in meinem Fall muss ich ein Ereignis senden, sobald jemand auf der Website registriert.

so in meinem registerAction() Ich versuche, ein Ereignis wie diese

$dispatcher = new EventDispatcher(); 
$event = new RegistrationEvent($user); 
$dispatcher->dispatch(RegistrationEvent::NAME, $event); 

Das ist meine RegistrationEvent Klasse schicken

namespace AppBundle\Event; 
use AppBundle\Entity\User; 
use Symfony\Component\EventDispatcher\Event; 

class RegistrationEvent extends Event 
{ 
    const NAME = 'registration.complete'; 

    protected $user; 

    public function __construct(User $user) 
    { 
     $this->user = $user; 
    } 

    public function getUser(){ 
     return $this->user; 
    } 

} 

Das ist meine RegistrationSubscriber Klasse

namespace AppBundle\Event;  
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\HttpKernel\Event\FilterResponseEvent; 
use Symfony\Component\HttpKernel\KernelEvents; 

class RegistrationSubscriber implements EventSubscriberInterface 
{ 
    public static function getSubscribedEvents() 
    { 
     return array(
      KernelEvents::RESPONSE => array(
       array('onKernelResponsePre', 10), 
       array('onKernelResponsePost', -10), 
      ), 
      RegistrationEvent::NAME => 'onRegistration' 
     ); 

    } 
    public function onKernelResponsePre(FilterResponseEvent $event) 
    { 
     // ... 
    } 

    public function onKernelResponsePost(FilterResponseEvent $event) 
    { 
     // ... 
    } 
    public function onRegistration(RegistrationEvent $event){ 

     var_dump($event); 
     die; 

    } 

} 

Nachdem ich Dies hatte ich gehofft, dass die Registrierung pr ocess würde bei der Funktion onRegistration aufhören, aber das ist nicht passiert, ich habe dann auf die Registerkarte Ereignisse des Profilers geschaut und ich sehe nicht, dass meine Veranstaltung ihre entweder aufgelistet.

Was fehlt mir hier? Ein Schub in die richtige Richtung wird wirklich geschätzt.

Update: Ich dachte, ich brauche einen Service für das benutzerdefinierte Ereignis zu registrieren, so habe ich den folgenden Code innerhalb services.yml

app.successfull_registration_subscriber: 
    class: AppBundle\Event\RegistrationSubscriber 
    arguments: ["@doctrine.orm.entity_manager"] 
    tags: 
     - { name: kernel.event_subscriber} 

Innerhalb der Registerkarte Ereignis von Profiler ich meine benutzerdefinierte Ereignis tun sehen werden aufgelistet aber es versendet immer noch nicht.

Antwort

1

Wenn Sie Ihre eigene EventDispatcher Instanz erstellen, senden Sie ein Ereignis, das von anderen Listenern nicht gehört werden kann (sie sind nicht mit dieser Dispatcher-Instanz verknüpft). Sie müssen den event_dispatcher Service verwenden, um alle Zuhörer informieren Sie mit den kernel.event_listener und kernel.event_subscriber Tags versehen werden:

// ... 

class RegistrationController extends Controller 
{ 
    public function registerAction() 
    { 
     // ... 

     $this->get('event_dispatcher')->dispatch(RegistrationEvent::NAME, new RegistrationEvent($user);); 
    } 
} 
+0

Vielen Dank, dass es :) jetzt gemacht funktionieren, wenn mein Verständnis richtig ist, jedes Mal, wenn ich eine Dispatch müssen custom event ich muss den code immer und immer wieder in verschiedenen aktionen des controllers oder in services schreiben, wenn die antwort darauf ja ist, wie kann ich dieses ereignis automatisch allen hörern zur verfügung stellen, anstatt es manuell zu versenden? Ich hoffe meine Frage macht Sinn – Saadia

+0

Nun, die Frage ist, wie sollten Ihre Zuhörer wissen, dass das Ereignis passiert ist, wenn Sie es nicht versenden? Sie müssen den Event Dispatcher jedoch nicht immer vom Controller holen. Wenn Sie beispielsweise Ihre Dienste konfigurieren, können Sie einfach den Ereignis-Dispatcher in ihn einfügen, den Sie verwenden, um Ihre anderen Abhängigkeiten zu injizieren. – xabbuh

Verwandte Themen