使语言环境在用户会话期间“粘性”
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.1,不再维护。
考虑升级你的Symfony项目6.2。欧宝娱乐app下载地址
使语言环境在用户会话期间“粘性”
欧宝娱乐app下载地址Symfony将区域设置存储在请求,这意味着这个设置不自动保存在请求(“粘性”)。但是,你可以在会话中存储区域,所以在后续请求中使用。
创建一个LocaleSubscriber
创建和新的事件订阅者。通常情况下,_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 / EventSubscriber / LocaleSubscriber.php名称空间应用程序\EventSubscriber;使用欧宝娱乐app下载地址\组件\HttpKernel\事件\GetResponseEvent;使用欧宝娱乐app下载地址\组件\HttpKernel\KernelEvents;使用欧宝娱乐app下载地址\组件\EventDispatcher\EventSubscriberInterface;类LocaleSubscriber实现了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的配置,你做的!欧宝娱乐app下载地址Symfony会自动知道事件订阅者和调用onKernelRequest
方法针对每个请求。
看到它工作,设置_locale
键手动会话(例如通过一些“改变语言环境”路线和控制器),或者创建一个路线的_locale违约。
显式配置用户
你也可以显式地配置它,以通过的default_locale:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:#……App \ EventSubscriber \ LocaleSubscriber:参数:[' % kernel.default_locale % ')#取消如果你不使用autoconfigure的下一行#标签(kernel.event_subscriber):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
< !——配置/服务。xml - - >< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id=“应用程序\ EventSubscriber \ LocaleSubscriber”><论点>% kernel.default_locale %< /论点>< !——取消下一行,如果你不使用autoconfigure - - >< !——<标记名称= "内核。事件_subscriber" /> -->< /span>< /服务>< /服务>< /容器>
1 2 3 4 5 6 7
/ /配置/ services.php使用应用程序\EventSubscriber\LocaleSubscriber;美元容器- >注册(LocaleSubscriber::类)- >addArgument (“% kernel.default_locale %”)/ /取消如果你不使用autoconfigure的下一行/ / - > addTag (“kernel.event_subscriber”);
就是这样!现在庆祝通过改变用户的语言环境,看到它是粘在整个请求。
记住,得到用户的语言环境,总是使用要求::getLocale方法:
1 2 3 4 5 6 7
/ /从一个控制器…使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;公共函数指数(请求美元请求){美元语言环境=美元请求- >getLocale ();}
基于用户的首选项设置语言环境
您可能希望进一步提高这一技术和基于用户定义区域设置登录用户的实体。然而,由于LocaleSubscriber
之前被称为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
/ / src / EventSubscriber / UserLocaleSubscriber.php名称空间应用程序\EventSubscriber;使用欧宝娱乐app下载地址\组件\EventDispatcher\EventSubscriberInterface;使用欧宝娱乐app下载地址\组件\HttpFoundation\会话\SessionInterface;使用欧宝娱乐app下载地址\组件\安全\Http\事件\InteractiveLoginEvent;使用欧宝娱乐app下载地址\组件\安全\Http\SecurityEvents;/ * * *存储区域*登录后的用户在会话中。这可以通过LocaleSubscriber之后。* /类UserLocaleSubscriber实现了EventSubscriberInterface{私人美元会话;公共函数__construct(SessionInterface美元会话){美元这- >会话=美元会话;}公共函数onInteractiveLogin(InteractiveLoginEvent美元事件){美元用户=美元事件- >getAuthenticationToken ()- >getUser ();如果(零= = !美元用户- >getLocale ()) {美元这- >会话- >集(“_locale”,美元用户- >getLocale ());}}公共静态函数getSubscribedEvents(){返回[SecurityEvents::INTERACTIVE_LOGIN = >“onInteractiveLogin”,);}}
谨慎
为了更新语言用户后立即改变了他们的语言首选项,您还需要更新会话当你改变用户
实体。
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。