Symfony用户粘性区域设置

时间:2018-10-23 10:47:04

标签: symfony locale

在过去的两天里,我一直在尝试创建自己的自定义LocaleSubscriber,该用户应该将用户的语言环境设置为用户的首选项或默认设置。

<?php

namespace App\Event\Subscriber;

use App\Entity\Language;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;

/**
 * Class LocaleSubscriber
 * @package App\Event\Subscriber
 */
class LocaleSubscriber
{
    /** @var EntityManagerInterface */
    private $entityManager;

    /** @var SessionInterface */
    private $session;

    /**
     * LocaleSubscriber constructor.
     *
     * @param EntityManagerInterface $entityManager
     * @param SessionInterface $session
     */
    public function __construct(EntityManagerInterface $entityManager, SessionInterface $session)
    {
        $this->entityManager = $entityManager;
        $this->session       = $session;
    }

    /** {@inheritdoc} */
    public function onInteractiveLogin(InteractiveLoginEvent $event)
    {
        $request = $event->getRequest();
        $user    = $event->getAuthenticationToken()->getUser();

        if (null !== $user->getLocale()) {
            $this->session->set('_locale', $user->getLocale());
            $request->setLocale($user->getLocale());
        } else {
            /** @var Language $language */
            $language = $this->entityManager->getRepository(Language::class)->findOneBy(['defaultLang' => true]);
            $language = $language->getSlug();

            $this->session->set('_locale', $language);
            $request->setLocale($language);
        }
    }
}

我正在尝试使用此系统,因为数据库中列出了所有语言(语言是我的实体之一),并且我想使该应用程序易于维护,并且适合非技术用户使用。

问题在于,离开此方法后,请求的语言环境返回到en,而新的语言环境仅保留在会话中。

我已经在函数dump($request, $this->session->all())的末尾转储,并且两者都使用相同的语言。另外,services.yaml中的优先级设置为15。

App\Event\Subscriber\LocaleSubscriber:
    tags:
        - { name: kernel.event_listener, event: security.interactive_login, method: onInteractiveLogin, priority: 15 }

有人知道为什么不起作用吗?有人遇到过同样的问题吗?有例子吗?

0 个答案:

没有答案