2012-05-29 10 views
5

lo tanto, estoy tratando de averiguar estos oyentes pero estoy teniendo problemas para encontrar cualquier información en el sitio de Symfony con respecto a ellos ..Symfony2 detector de eventos

Inicialmente, quería crear un oyente que activaría el cada carga de página ... pensé que eso podría ser perjudicial para el rendimiento general del sistema, así que pensé que solo se activaría en:/y/otherpage

Pero, de nuevo, tengo problemas para encontrar información sobre dónde comenzar con el oyente Cualquier ayuda apreciada ... Todo este oyente estará haciendo, está usando Doctrine para verificar la base de datos y establecer una sesión según lo que encuentre.

De nuevo, cualquier ayuda o sugerencia apreciada. Gracias.

Respuesta

10

Hago algo similar para verificar que el subdominio no haya cambiado. Usted puede poner al oyente en como un servicio en el archivo de configuración de la siguiente manera:

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 } 

No estoy exactamente seguro de cómo funciona la prioridad, pero me he dado cuenta si está configurado demasiado alto que no se presentaría antes que el resto de la aplicación. Está en mi lista de tareas pendientes para investigar un poco más.

Aquí hay un ejemplo de cómo podría verse el oyente.

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

    } 
} 

No estoy seguro de la mejor manera de establecer que sólo se ejecute en ciertas páginas, pero mi mejor conjetura sería comprobar la ruta y sólo golpear a su base de datos cuando los partidos de la ruta lo que establece.

¡Espero que empieces!

Greg

+0

Gracias por la información Greg! Voy a tener un juego y ver qué puedo hacer con esto ... podría incluso ser capaz de salir adelante haciendo que verifique cada carga de página (todas las consultas serán verificando el DB para ver si hay alguna) es una entrada de hoy para el usuario o no) .. ¡Gracias de nuevo! – Justin

+0

No hay problema. No me preocuparía demasiado llamar la función del oyente en cada carga de la página, es un servicio tan pequeño que no debería afectar el rendimiento, solo trata de encontrar la forma de evitar que el oyente golpee el DB cada vez a menos que específicamente lo necesite. Déjame saber cómo vas, feliz de intentar ayudarte si tienes algún problema. – greg

+0

Estoy haciendo lo mismo, pero si no se encuentra nada en la consulta de Listener, quiero cortocircuitar todo y redirigir a una página de plantilla "Coming Soon". ¿Alguna idea sobre cómo construir eso dentro del Oyente? ¡Gracias! – Acyra

Cuestiones relacionadas