Подтвердить что ты не робот

Symfony2: после успешного входа в систему выполните ряд действий

Мне нужно выполнить набор действий после успешного входа пользователя в систему. Сюда входит загрузка данных из базы данных и сохранение их в сеансе.

Каков наилучший подход к реализации этого?

4b9b3361

Ответ 1

Вы можете добавить слушателя к событию 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);
   }

}

Ответ 2

Вы даже можете извлечь экземпляр пользователя из самого события, не нужно вводить хранилище токенов!

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