在过去的两天里,我一直在尝试创建自己的自定义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 }
有人知道为什么不起作用吗?有人遇到过同样的问题吗?有例子吗?