Eventos en Symfony2

En este artículo veremos los eventos que lanza Symfony2, para ello se recomienda haber leído el artículo anterior sobre eventos. En principio este artículo también contenía un ejemplo de custom event, pero hemos decidido separarlo a otro artículo para que se vea más claro.

Eventos en Symfony2

Vamos a hacer un repaso de todos los eventos que lanza Symfony2, en qué momento se lanzan (sin contar con los del componente Form) y cómo registramos listeners:

Eventos

KernelEvents

Estos son los eventos lanzados por el componente HttpKernel:

  • kernel.request: Este evento se lanza nada más empieza a manejarse la petición, lo que permite crear una respuesta antes de que se ejecute otro código del framework. La instancia que se recibe en este evento es de la clase Symfony\Component\HttpKernel\Event\GetResponseEvent.
  • kernel.exception: Este evento se lanza cuando aparece una excepción no capturada y permite crear una respuesta para una excepción lanzada o modificar la excepción. La instancia que se recibe en este evento es de la clase Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent.
  • kernel.view: Este evento se lanza cuando lo que devuelve un controller no es una instancia de Response permitiendo crear una respuesta con lo devuelto por el controller. La instancia que se recibe en este evento es de la clase Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent.
  • kernel.controller: Este evento se lanza una vez que se ha encontrado un controller para manejar la petición, en este punto se podría cambiar el controlador que la va a manejar. La instancia que se recibe en este evento es de la clase Symfony\Component\HttpKernel\Event\FilterControllerEvent.
  • kernel.response: Este evento se lanza cuando se crea la respuesta para una petición dada y permite modificar el contenido de esa respuesta. La instancia que se recibe en este evento es de la clase Symfony\Component\HttpKernel\Event\FilterResponseEvent.
  • kernel.terminate: Este evento se lanza cuando ya se ha enviado la respuesta, permitiendo realizar trabajos pesados. La instancia que se recibe en este evento es de la clase Symfony\Component\HttpKernel\Event\PostResponseEvent.

SecurityEvents

Eventos que tienen que ver con la seguridad:

  • security.interactive_login: Este evento se lanza cuando un usuario loguea a través de un formulario, cookie o mediante X509. La instancia que se recibe en este evento es de la clase Symfony\Component\Security\Http\Event\InteractiveLoginEvent.
  • security.switch_user: Este evento se lanza cuando un usuario se intenta cambiar por otro usuario y cuando intenta volver al usuario inicial (impersonating). La instancia que se recibe en este evento es de la clase Symfony\Component\Security\Http\Event\SwitchUserEvent.

AuthenticationEvents

Eventos de autenticación:

  • security.authentication.success: Este evento se lanza una cuando se autentica un token por alguno de los providers. La instancia que se recibe en este evento es de la clase Symfony\Component\Security\Core\Event\AuthenticationEvent.
  • security.authentication.failure: Este evento se lanza cuando ninguno de los providers ha podido autenticar un token. La instancia que se recibe en este evento es de la clase Symfony\Component\Security\Core\Event\AuthenticationFailureEvent.

Registrar listeners

Para registrar listeners en Symfony2 lo haremos como servicios, para ello aparte de declarar el servicio tendremos que añadirle un tag (tenemos pendiente en el futuro escribir algún artículo sobre tags) en la definición, esto permitirá que cuando se cargue el bundle donde lo estamos definiendo, Symfony2 sepa que estamos registrando listeners y los añada en el EventDispatcher.

Listeners

Teniendo el siguiente ejemplo:

Se declara como servicio:

El tag lo nombramos como kernel.event_listener para que lo registre como listener y al ser de tipo listener hay que indicar a qué evento se suscribe y cuál es el método al que tiene que llamar cuando se produzca dicho evento, la prioridad es opcional y por defecto si no se indica es 0.

Subscribers

En la clase subscriber indicamos a qué eventos se suscribe:

Y lo declaramos como servicio también:

Con los subscribers en el tag sólo hay que indicar el nombre kernel.event_subscriber.

En próximos artículos iremos usando algunos de estos eventos.