php - 基于用户偏好的区域设置
问题描述
我尝试根据用户设置(即用户实体中的“语言”属性)设置语言环境,但在第一次请求时失败(用户经过身份验证),因为在 FirewallListener 之前调用了 LocaleListener(以及 TranslatorListener)。
我在用户会话期间尝试了这个示例使语言环境“粘滞”,但在第一次请求时,默认语言环境(在配置中)是“fr”,我的用户用“en”定义了他的语言,最后页面以法语显示。
诀窍可能是创建一个侦听器(在 LocaleListener 或 TranslatorListener 之前调用)以从另一个方法获取用户的语言环境,但我找不到要使用的方法。你有什么建议吗?
解决方案
最后,我使用 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],
];
}
我希望这能有所帮助;)
推荐阅读
- java - 卡夫卡流不工作:组协调员不断被发现和不可用/无效
- groovy - 在启动脚本中使用 ConfiguredGraphFactory 失败
- javascript - 如何在 MS Edge 中合并 javascript 对象
- vue.js - Vuejs v-model 没有更新
- amazon-web-services - SQL Server 到 rds sql。我们需要更改连接字符串吗
- javascript - 为什么 jQuery 插件会阻止我的自定义函数工作?
- sql - SQL Recursive:获取孩子的父值
- iis-7.5 - 用于 Kerberos 身份验证的 IIS 日志监控
- typescript - 为什么 Typescript 允许对类型进行切片?
- flutter - 如何在颤动中将图像上传到 s3 预签名 URL?