Symfony2登录事件侦听器和security.interactive_登录事件从未使用FOSUser触发

Symfony2登录事件侦听器和security.interactive_登录事件从未使用FOSUser触发,security,events,symfony,login,fosuserbundle,Security,Events,Symfony,Login,Fosuserbundle,我正在尝试添加一个Symfony2登录事件监听器,目标是在每个请求上设置一个数据库存储的区域设置(如果用户已登录),并返回到默认设置(如果没有用户登录)。 我使用FOSUserBundle,并试图让security.interactive\u登录事件正常工作。我在互联网上找到了很多这样的代码: 我有自己的FOSUserBundle子包和services.yml中的这个实现: my_user.security.interactive_login_listener: class: M

我正在尝试添加一个Symfony2登录事件监听器,目标是在每个请求上设置一个数据库存储的区域设置(如果用户已登录),并返回到默认设置(如果没有用户登录)。 我使用FOSUserBundle,并试图让security.interactive\u登录事件正常工作。我在互联网上找到了很多这样的代码:

我有自己的FOSUserBundle子包和services.yml中的这个实现:

my_user.security.interactive_login_listener:
        class: My\UserBundle\EventListener\UserListener
        arguments: [@security.context, @doctrine]
        tags:
            - { name: kernel.event_listener, event: security.interactive_login, method: setLocaleForAuthenticatedUser }

my_user.security.kernel_request_listener:
        class: My\UserBundle\EventListener\UserListener
        arguments: [@security.context, @doctrine]
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: setLocaleForUnauthenticatedUser }
user.locales.kernel_request_listener:
        class: Acme\UserBundle\EventListener\LocaleListener
        arguments: [ @service_container, [ 'en', 'fr', 'ru' ] ]
        tags: [{ name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: -255 }]
问题是,security.interactive_登录事件永远不会触发,即使在登录时也不会触发。相反,始终触发我的setLocaleForUnauthenticatedUser。
我发现的每一个代码示例都能流畅地工作,我的应用程序有什么问题吗?

这里也有同样的问题。但问题不在于事件没有被触发。问题是重定向后,请求区域设置丢失。借助此链接的帮助:

(并基于)

我想出了解决办法。在UserListener中:

class UserListener
{
    private $session;

    public function setSession($session) {
        $this->session = $session;
    }    

    public function setLocaleForUnauthenticatedUser(GetResponseEvent $event)
    {
        if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
            return;
        }
        $request = $event->getRequest();
        if ('undefined' == $request->getLocale()) {
            if($locale = $request->getSession()->get('_locale')) {
                $request->setLocale($locale);
            } else {
                $request->setLocale($request->getPreferredLanguage());
            }
        }
    }

    public function setLocaleForAuthenticatedUser(InteractiveLoginEvent $event)
    {
        $user = $event->getAuthenticationToken()->getUser();

        if ($locale = $user->getLocale()) {
//            $event->getRequest()->setLocale($user->getLocale());
            $this->session->set('_locale', $locale);
        }
    }
}
在services.yml中,您应该声明:

your_listener_name:
    class: ...\UserBundle\EventListener\UserListener
    calls:
        - [ setSession, ['@session'] ]
    tags:
        - { name: kernel.event_listener, event: security.interactive_login, method: setLocaleForAuthenticatedUser }

希望这能有所帮助。

也找到了答案,并做了大致相同的工作: 这确实没有问题,但在登录后会有某种重定向,因此探查器不会显示触发交互式登录侦听器的实际请求

use Symfony\Component\Security\Http\Event\InteractiveLoginEvent,
    Symfony\Component\Security\Http\Event\FilterControllerEvent,
    Symfony\Component\HttpKernel\Event\GetResponseEvent,
    Symfony\Component\HttpKernel\HttpKernelInterface;
use FOS\UserBundle\Entity\User as BaseUser;

class LocaleListener {

    protected $container;
    protected $availableLocales;

    public function __construct(\Symfony\Component\DependencyInjection\Container $container, $availableLocales) {
        $this->container = $container;
        $this->availableLocales = $availableLocales;
    }

    public function onKernelRequest(GetResponseEvent $event) {
        $request = $event->getRequest();
        $locale = $request->getPreferredLanguage($this->availableLocales);
        $session = $request->getSession();

        $token = $this->container->get('security.context')->getToken();
        if( is_object( $token ) ) {
            $user = $token->getUser();
            if ($user instanceof BaseUser) {
                $locale = $user->getLocale();
            }
        }

        $session = $this->container->get('session');
        $session->set('_locale', $locale);
        $request->setLocale($locale);
    }
 }
在services.yml中:

my_user.security.interactive_login_listener:
        class: My\UserBundle\EventListener\UserListener
        arguments: [@security.context, @doctrine]
        tags:
            - { name: kernel.event_listener, event: security.interactive_login, method: setLocaleForAuthenticatedUser }

my_user.security.kernel_request_listener:
        class: My\UserBundle\EventListener\UserListener
        arguments: [@security.context, @doctrine]
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: setLocaleForUnauthenticatedUser }
user.locales.kernel_request_listener:
        class: Acme\UserBundle\EventListener\LocaleListener
        arguments: [ @service_container, [ 'en', 'fr', 'ru' ] ]
        tags: [{ name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: -255 }]

symfony2的分支版本和FOSUserBundle的版本是什么?