我尝试根据用户设置(即用户实体中的“语言”属性)设置语言环境,但是由于用户在防火墙侦听器之前调用了LocaleListener(还包括TranslatorListener),因此它在第一个请求(使用用户身份验证)时失败。
我尝试了此示例documentation,但是在首次请求时,默认语言环境(在配置中)为“ fr”,我的用户使用“ en”定义了他的语言,最后页面以法语显示。
诀窍可能是创建一个侦听器(在LocaleListener或TranslatorListener之前调用)以从另一种方法获取用户的语言环境,但是我找不到要使用的方法。你有什么建议吗?
答案 0 :(得分:0)
最后,我使用了Compiler Pass覆盖了TranslatorListener定义,现在以FirewallListener命名。
class OverrideTranslatorListenerCompilerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container): void
{
if ($container->hasDefinition('translator_listener')) {
$definition = $container->getDefinition('translator_listener');
$definition->setTags([
'kernel.event_listener' => [
[
'event' => KernelEvents::REQUEST,
'method' => 'onKernelRequest',
'priority' => 2, // 10 before
],
[
'event' => KernelEvents::FINISH_REQUEST,
'method' => 'onKernelFinishRequest',
'priority' => 0, // not changed, needed because overridding ALL tags
],
],
]);
}
}
}
还有我的订户
class LocaleSubscriber implements EventSubscriberInterface
{
...
/**
* @var Security
*/
private $security;
public function __construct(..., Security $security)
{
...
$this->security = $security;
}
public function onKernelRequest(GetResponseEvent $event): void
{
$request = $event->getRequest();
if (!$event->isMasterRequest()) {
return;
}
if (null !== ($user = $this->security->getUser())) {
$request->setLocale($user->getLanguage());
return;
}
...
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest', 4],
];
}
我希望这会有所帮助;)