2012-05-29 21 views
5

Quindi, sto cercando di capire questi ascoltatori, ma sto avendo problemi di trovare tutte le informazioni sul sito di symfony per quanto riguarda loro ..Symfony2 listener di eventi

Inizialmente, ho voluto creare un listener che innescherebbe su ogni caricamento della pagina ... ho pensato che potrebbe essere dannoso per le prestazioni complessive del sistema quindi ho pensato di farlo scattare solo su:/e/otherpage

Ma ancora, ho problemi a trovare qualsiasi informazione su dove inizia con l'ascoltatore. Qualsiasi aiuto apprezzato .. Tutto questo ascoltatore farà, sta usando Doctrine per controllare il database e impostare una sessione in base a ciò che trova ..

Ancora, qualsiasi aiuto o suggerimento apprezzato. Grazie.

risposta

10

Faccio qualcosa di simile per controllare che il sottodominio non sia cambiato. Si può mettere l'ascoltatore in un servizio nel file di configurazione come segue:

services: 
    page_load_listener: 
     class: Acme\SecurityBundle\Controller\PageLoadListener 
     arguments: 
      security: "@security.context", 
      container: "@service_container" 
     tags: 
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 64 } 

io non sono esattamente sicuro di come priorità opere, ma ho trovato se è troppo alto che non avrebbe eseguito prima che il resto dell'applicazione. È sulla mia lista delle cose da fare per cercare un po 'di più.

Ecco un esempio di come potrebbe apparire l'ascoltatore.

namespace Acme\SecurityBundle\Controller; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\Security\Core\SecurityContext; 
use Symfony\Component\HttpKernel\Event\GetResponseEvent; 

class PageLoadListener extends controller 
{ 
    private $securityContext; 
    protected $container; 
    protected $query; 

    public function __construct(SecurityContext $context, $container, array $query = array()) 
    { 
     $this->securityContext = $context; 
     $this->container = $container; 
     $this->query = $query; 
    } 

    public function onKernelRequest(GetResponseEvent $event) 
    {  
     //if you are passing through any data 
     $request = $event->getRequest(); 

     //if you need to update the session data 
     $session = $request->getSession();    

     //Whatever else you need to do... 

    } 
} 

Non sono sicuro del modo migliore per impostare l'esecuzione solo in alcune pagine, ma la mia ipotesi migliore sarebbe quello di controllare la rotta e ha colpito solo il vostro db quando le partite percorso tutto quello che impostato.

Spero che tu possa iniziare!

Greg

+0

Grazie per le informazioni Greg! Avrò un gioco in giro e vedrò cosa riesco a tirar fuori da questo ... Potrei anche essere in grado di cavarsela controllando ogni caricamento di tutte le pagine (tutte le query andranno a controllare il DB per vedere se c'è è una voce per oggi per l'utente o no) Grazie ancora! – Justin

+0

Nessun problema. Non mi preoccuperei troppo di chiamare la funzione listener su ogni caricamento della pagina, è un servizio così piccolo che non dovrebbe avere alcun effetto sulle prestazioni, basta provare a trovare un modo per evitare che l'ascoltatore colpisca il DB ogni volta a meno che non sia specificamente necessario. Fammi sapere come vai, felice di provare e aiutarti se hai qualche problema. – greg

+0

Sto facendo la stessa cosa, ma se non viene trovato nulla nella query Listener voglio cortocircuitare tutto e reindirizzare a una pagina di modello "Coming Soon". Qualche idea su come costruirla all'interno del Listener? Grazie! – Acyra

Problemi correlati