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

Dol*_*orf 7 security events login symfony fosuserbundle

我正在尝试添加一个Symfony2登录事件监听器,目标是在每个请求上记录用户时设置数据库存储的语言环境,并回退到没有用户登录的默认语言环境.我使用FOSUserBundle,我试图让security.interactive_login事件起作用.我在互联网上找到了很多像这样的代码:http://dev.dbl-a.com/symfony-2-0/how-to-add-a-symfony2-login-event-listener/

我有自己的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 }
Run Code Online (Sandbox Code Playgroud)

问题是,即使在记录时,也永远不会触发security.interactive_login事件.相反,我的setLocaleForUnauthenticatedUser总是被触发.我找到的每个代码示例似乎都很流畅,我的应用程序出了什么问题?

bin*_*gen 0

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

使用 symfony 2.1 更改语言环境

(并以此为基础

我想出了如何解决它。在用户监听器中:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在 services.yml 中,您应该声明:

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

希望这可以帮助。