在用户会话期间使区域设置“粘滞”
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.4,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
在用户会话期间使区域设置“粘滞”
ob娱乐下载Symfony将区域设置存储在Request中,这意味着该设置不会跨请求自动保存(“粘性”)。但是,你可以将区域设置存储在会话中,以便在后续请求中使用。
创建localessubscriber
创建一个新事件订阅者.通常情况下,_locale
用作表示区域设置的路由参数,尽管您可以根据需要确定正确的区域设置:
12 34 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;使用ob娱乐下载\组件\EventDispatcher\EventSubscriberInterface;使用ob娱乐下载\组件\HttpKernel\事件\RequestEvent;使用ob娱乐下载\组件\HttpKernel\KernelEvents;类LocaleSubscriber实现了EventSubscriberInterface{私人美元defaultLocale;公共函数__construct(美元defaultLocale=“en”){美元这->defaultLocale =美元defaultLocale;}公共函数onKernelRequestRequestEvent (美元事件){美元请求=美元事件->getRequest ();如果(!美元请求->hasPreviousSession ()) {返回;}//尝试查看locale是否被设置为_locale路由参数如果(美元语言环境=美元请求->属性->get (“_locale”)) {美元请求->getSession ()->集(“_locale”,美元语言环境);}其他的{//如果这个请求没有显式的区域设置,使用会话中的一个美元请求->setLocale (美元请求->getSession ()->get (“_locale”,美元这->defaultLocale));}}公共静态函数getSubscribedEvents(){返回[//必须在默认Locale监听器之前注册(即优先级高于)KernelEvents::Request => [[“onKernelRequest”,20.]]];}}
如果你在用默认的服务。yaml的配置,你完蛋了!ob娱乐下载Symfony将自动知道事件订阅者并调用onKernelRequest
方法。
要查看它的工作情况,请设置_locale
键在会话上手动(例如通过一些“更改区域设置”路由&控制器),或创建一个路由_locale违约.
就是这样!现在通过改变用户的语言环境来庆祝,并看到它在整个请求中都是粘性的。
记住,要获取用户的区域设置,总是使用要求::getLocale方法:
1 2 3 4 5 6 7
//从控制器…使用ob娱乐下载\组件\HttpFoundation\请求;公共函数指数(请求美元请求){美元语言环境=美元请求->getLocale ();}
根据用户的偏好设置语言环境
您可能希望进一步改进此技术,并基于登录用户的用户实体定义区域设置。然而,自从LocaleSubscriber
在FirewallListener
,它负责处理身份验证和设置用户令牌TokenStorage
,您无法访问当前登录的用户。
假设你有一个语言环境
你的财产用户
实体,并希望将其用作给定用户的区域设置。要实现这一点,您可以钩子到登录过程中,并在用户会话被重定向到其第一个页面之前,用这个区域设置值更新用户会话。
对象上的事件订阅器要做到这一点security.interactive_login
事件:
12 34 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;使用ob娱乐下载\组件\EventDispatcher\EventSubscriberInterface;使用ob娱乐下载\组件\HttpFoundation\会话\SessionInterface;使用ob娱乐下载\组件\安全\Http\事件\InteractiveLoginEvent;使用ob娱乐下载\组件\安全\Http\SecurityEvents;/** *在*登录后的会话中存储用户的语言环境。之后localessubscriber可以使用它。* /类UserLocaleSubscriber实现了EventSubscriberInterface{私人美元会话;公共函数__construct(SessionInterface美元会话){美元这->会话=美元会话;}公共函数onInteractiveLogin(InteractiveLoginEvent美元事件){美元用户=美元事件->getAuthenticationToken ()->getUser ();如果(零= = !美元用户->getLocale ()) {美元这->会话->集(“_locale”,美元用户->getLocale ());}}公共静态函数getSubscribedEvents(){返回[SecurityEvents::INTERACTIVE_LOGIN = >“onInteractiveLogin”,);}}
谨慎
为了在用户更改其语言首选项后立即更新语言,还需要在更改时更新会话用户
实体。
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。