使语言环境在用户会话期间“粘性”

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.7,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

使语言环境在用户会话期间“粘性”

Symfony 2欧宝娱乐app下载地址.1之前,语言环境是存储在一个会话属性_locale。自2.1以来,它存储在请求,这意味着它不是“粘性”期间用户的请求。在本文中,您将学习如何让用户“粘性”的场所,一旦设置,同样的地区将被用于所有后续请求。

创建一个LocaleListener

模拟语言环境是存储在一个会话中,您需要创建并注册一个新的事件监听器。侦听器是这样的。通常情况下,_locale作为路由参数表示地区,尽管它并不重要你如何确定所需的语言环境的要求:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40
/ / src / AppBundle / EventListener / LocaleListener.php名称空间AppBundle\EventListener;使用欧宝娱乐app下载地址\组件\HttpKernel\事件\GetResponseEvent;使用欧宝娱乐app下载地址\组件\HttpKernel\KernelEvents;使用欧宝娱乐app下载地址\组件\EventDispatcher\EventSubscriberInterface;LocaleListener实现了EventSubscriberInterface{私人美元defaultLocale;公共函数__construct(美元defaultLocale=“en”){美元- >defaultLocale =美元defaultLocale;}公共函数onKernelRequest(GetResponseEvent美元事件){美元请求=美元事件- >getRequest ();如果(!美元请求- >hasPreviousSession ()) {返回;}/ /尝试看看区域被设置为一个_locale路由参数如果(美元语言环境=美元请求- >属性- >get (“_locale”)){美元请求- >getSession ()- >集(“_locale”,美元语言环境);}其他的{/ /如果没有明确的区域设置在这个请求时,使用一个会话美元请求- >setLocale (美元请求- >getSession ()- >get (“_locale”,美元- >defaultLocale));}}公共静态函数getSubscribedEvents(){返回数组(/ /必须注册之前(即优先级高于)默认区域设置侦听器KernelEvents::请求= >数组(数组(“onKernelRequest”,20.)));}}

然后注册侦听器:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
服务:app.locale_listener:类:AppBundle \ EventListener \ LocaleListener参数:[' % kernel.default_locale % ')标签:- - - - - -{名称:kernel.event_subscriber}

就是这样!现在庆祝通过改变用户的语言环境,看到它是粘在整个请求。记住,得到用户的语言环境,总是使用要求::getLocale方法:

1 2 3 4 5 6 7
/ /从一个控制器…使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;公共函数indexAction(请求美元请求){美元语言环境=美元请求- >getLocale ();}

基于用户的首选项设置语言环境

您可能希望进一步提高这一技术和基于用户定义区域设置登录用户的实体。然而,由于LocaleListener之前被称为FirewallListener负责处理身份验证和设置用户令牌TokenStorage,您没有访问的用户登录。

假设您有一个定义语言环境财产在你用户实体和您想要使用给定用户的语言环境。为了实现这一点,您可以钩到登录过程和更新用户的会话与这个地区值之前,他们被重定向到第一页。

要做到这一点,你需要一个事件侦听器security.interactive_login事件:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
/ / src / AppBundle / EventListener / UserLocaleListener.php名称空间AppBundle\EventListener;使用欧宝娱乐app下载地址\组件\EventDispatcher\EventSubscriberInterface;使用欧宝娱乐app下载地址\组件\HttpFoundation\会话\会话;使用欧宝娱乐app下载地址\组件\安全\Http\事件\InteractiveLoginEvent;使用欧宝娱乐app下载地址\组件\安全\Http\SecurityEvents;/ * * *存储区域*登录后的用户在会话中。这可以通过LocaleListener之后。* /UserLocaleListener{/ * * *@var会话* /私人美元会话;公共函数__construct(会话美元会话){美元- >会话=美元会话;}/ * * *@paramInteractiveLoginEvent事件* /美元公共函数onInteractiveLogin(InteractiveLoginEvent美元事件){美元用户=美元事件- >getAuthenticationToken ()- >getUser ();如果(= = !美元用户- >getLocale ()) {美元- >会话- >集(“_locale”,美元用户- >getLocale ());}}公共静态函数getSubscribedEvents(){返回数组(SecurityEvents::INTERACTIVE_LOGIN = >数组(数组(“onInteractiveLogin”,15)));}}

然后注册侦听器:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7
# app / config / services.yml服务:app.user_locale_listener:类:AppBundle \ EventListener \ UserLocaleListener参数:(“@ session”)标签:- - - - - -{名称:kernel.event_listener,事件:security.interactive_login,方法:onInteractiveLogin}

谨慎

为了更新语言用户后立即改变了他们的语言首选项,您需要更新会话更新后用户实体。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。