2014-07-16 9 views
8

Ich versuche, benutzerdefinierte Ereignis zu erstellen, aber es kann nicht funktionieren.Symfony2 benutzerdefinierte Ereignis Dispatcher und Listener

Was ich getan habe:

1.Ich erstellt Ereignis identifiziert Klasse in

namespace Path\ToBundle; 
final class CookieEvents 
{ 
    const COOKIE_EVENT = 'cookie.event'; 
} 

2.Created Ereignis

namespace Path\ToBundle\EventListener; 
use Path\ToBundle\Event\FilterResponseEvent; 
class ResponseListener 
{ 
    public function onCookieInit(FilterResponseEvent $event) 
    { 
     //some complex logic goes here 
     echo('test'); 
    } 
} 

3.created Ereignis-Listener

namespace Path\ToBundle\Event; 
use Symfony\Component\EventDispatcher\Event; 
use Symfony\Component\HttpFoundation\Response; 
class FilterResponseEvent extends Event 
{ 
    protected $response; 
    public function __construct(Response $response) 
    { 
     $this->response = $response; 
    } 
    public function getResponse() 
    { 
     return $this->response; 
    } 
} 

4.Tried Ereignis-Listener innerhalb service.yml

kernel.listener.cookie.event: 
    class: Path\ToBundle\Event\ResponseListener 
    tags: 
     - { name: kernel.event_listener, event: cookie.event, method: onCookieInit } 

5.Next Ich versuche -Ereignisses an Innen-Controller-Aktion

//includes before class 
use Symfony\Component\EventDispatcher\EventDispatcher; 
use Path\ToBundle\Event\FilterResponseEvent; 

//inside controller action 
//... $response variable is created 

$dispatcher = new EventDispatcher(); 
$event = new FilterResponseEvent($response); 
$dispatcher->dispatch(CookieEvents::COOKIE_EVENT, $event); 

return $response; 
//EOF controller action 

Was ich versuche zu registrieren zu erreichen Ereignis in der Lage sein Feuer auf bestimmte Aktionen. Leider funktioniert das nicht. Das Konzept der Ereignisse ist neu für mich und ich bin immer noch nicht sicher, was ich hier mache, aber es ist das, was ich aus den Beispielen herausfinden konnte. Vielleicht könnte mir jemand sagen, ob ich richtig richte und mich korrigiere? Wenn nicht, wird einige Anleitung noch mehr geschätzt.

+3

Für den Dispatcher Ihre '$ Dispatcher = $ this-> verwenden sollten get ('event_dispatcher') ', da Sie eine andere Instanz verwenden werden. – qooplmao

+2

Dies ist ein großartiges Beispiel für das Einrichten benutzerdefinierter Ereignisse – lopsided

Antwort

4

Danke, @Qoop für die korrekte Verwendung von Dispatcher den Hinweis auf:

$dispatcher = $this->get('event_dispatcher') 

Auch gab es Namespace-Fehler:

class: Path\ToBundle\Event\ResponseListener //incorrect 

class: Path\ToBundle\EventListener\ResponseListener //correct 
Verwandte Themen