Мне нужно выполнить набор действий после успешного входа пользователя в систему. Сюда входит загрузка данных из базы данных и сохранение их в сеансе.
Каков наилучший подход к реализации этого?
Вы можете добавить слушателя в событие security.interactive_login
.
прикрепите своего слушателя так. В этом примере я также передаю контекст безопасности и сеанс как зависимости.
Примечание. SecurityContext устарел с Symfony 2.6. См. 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 }
и в вашем слушателе вы можете хранить все, что захотите, в сеансе. В этом случае я устанавливаю часовой пояс пользователей.
<?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); } }
Вы даже можете извлечь экземпляр пользователя из самого события, не нужно вводить хранилище токенов!
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) { $event->getAuthenticationToken()->getUser() }