gpt4 book ai didi

php - symfony 2 根据存储在数据库中的用户首选项设置语言环境

转载 作者:可可西里 更新时间:2023-11-01 13:28:19 27 4
gpt4 key购买 nike

我正在尝试根据存储在数据库中的当前用户首选项设置语言环境。

因此,我们的 User 类有一个 getPreferredLanguage,它返回一个语言环境标识(“en”、“fr_FR”等)。

我考虑过以下方法:

  • 注册一个订阅 KernelEvents::REQUEST 事件的“locale”监听器服务。
  • 此服务可以访问安全上下文(通过其构造函数)
  • 此服务的 onKernelRequest 方法尝试从安全上下文中获取用户,获取用户的首选语言环境,并将其设置为请求的语言环境。

不幸的是,这不起作用。当调用“locale”监听器服务的 onRequestEvent 方法时,安全上下文没有 token 。上下文监听器似乎在很晚的阶段(优先级为 0)被调用,并且不可能告诉我的“语言环境”监听器在安全上下文之前运行。

有谁知道如何解决这种方法,或建议另一种方法?

最佳答案

您可能对语言环境监听器感兴趣,我在这个答案中发布了它:Symfony2 locale detection: not considering _locale in session

编辑:如果用户在配置文件中更改他的语言,没有问题。如果您使用的是 FOSUserBundle (master),您可以连接到配置文件编辑成功事件。否则在您的配置文件 Controller 中,如果您使用的是自制系统。以下是 FOSUserBundle 的示例:

<?php
namespace Acme\UserBundle\EventListener;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class ChangeLanguageListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::PROFILE_EDIT_SUCCESS => 'onProfileEditSuccess',
);
}

public function onProfileEditSuccess(FormEvent $event)
{
$request = $event->getRequest();
$session = $request->getSession();
$form = $event->getForm();
$user = $form->getData();
$lang = $user->getLanguage();

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

并在 services.yml 中

services:
acme.change_language:
class: Acme\UserBundle\EventListener\ChangeLanguageListener
tags:
- { name: kernel.event_subscriber }

对于多个浏览器中的多个 session 没有问题,因为每个新 session 都需要重新登录。嗯,好的,不是在更改语言之后,因为只会更新当前 session 。但是你可以修改 LanguageListener 来支持这个。
如果管理员更改语言,这种情况应该是微不足道的。

关于php - symfony 2 根据存储在数据库中的用户首选项设置语言环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16623409/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com