2014-07-16 25 views
8

Sto tentando di creare un evento personalizzato, ma non riesco a farlo funzionare.Symfony2 dispatcher di eventi personalizzati e listener

quello che ho fatto:

1.I creato classe identificare eventi in

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

2.Created

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

evento 3.created ascoltatore

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. Provato per registrare listener di eventi all'interno service.yml

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

5.Next cerco di inviare evento all'interno azione di controllo

//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 

Quello che sto cercando di realizzare è quello di poter evento fuoco su determinate azioni. Sfortunatamente questo non funziona. Il concetto di eventi è nuovo per me e, non sono ancora sicuro di quello che sto facendo qui, ma è quello che sono riuscito a capire dagli esempi. Forse qualcuno potrebbe dirmi se sto andando nella giusta direzione e correggermi? In caso contrario, alcune indicazioni sono ancora più apprezzate.

+3

per il dispatcher vostra dovrebbe usare '$ dispatcher = $ this-> get ('event_dispatcher') 'dato che userete un'istanza diversa. – qooplmao

+2

Questo è un ottimo esempio di come impostare eventi personalizzati – lopsided

risposta

4

Grazie, @Qoop per aver ricordato corretto utilizzo dello speditore:

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

Inoltre, c'era errore di spazio dei nomi:

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

class: Path\ToBundle\EventListener\ResponseListener //correct 
Problemi correlati