Symfony2: después del evento de inicio de sesión exitoso, realice un conjunto de acciones

Necesito realizar un conjunto de acciones después de que un usuario inicie sesión exitosamente. Esto incluye cargar datos de la base de datos y almacenarlos en la sesión.

¿Cuál es el mejor enfoque para implementar esto?

Puede agregar un oyente al evento security.interactive_login .

adjunte a su oyente como así. En este ejemplo, también paso el contexto de seguridad y la sesión como dependencias.

Nota: SecurityContext está en desuso a partir de Symfony 2.6. Consulte http://symfony.com/blog/new-in-symfony-2-6-security-component-improvements

 parameters: # ... account.security_listener.class: Company\AccountBundle\Listener\SecurityListener services: # ... account.security_listener: class: %account.security_listener.class% arguments: ['@security.context', '@session'] tags: - { name: kernel.event_listener, event: security.interactive_login, method: onSecurityInteractiveLogin } 

y en su oyente puede almacenar lo que quiera en la sesión. En este caso, configuré la zona horaria de los usuarios.

 < ?php namespace Company\AccountBundle\Listener; use Symfony\Component\Security\Core\SecurityContextInterface; use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; class SecurityListener { public function __construct(SecurityContextInterface $security, Session $session) { $this->security = $security; $this->session = $session; } public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) { $timezone = $this->security->getToken()->getUser()->getTimezone(); if (empty($timezone)) { $timezone = 'UTC'; } $this->session->set('timezone', $timezone); } } 

¡Incluso puede recuperar la instancia del usuario del evento en sí, sin necesidad de inyectar el almacenamiento de token!

 public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) { $event->getAuthenticationToken()->getUser() }