在用户会话期间使区域设置“粘滞”
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.2,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
在用户会话期间使区域设置“粘滞”
ob娱乐下载Symfony将区域设置存储在请求中,这意味着该设置在后续请求中不可用。在本文中,您将学习如何在会话中存储区域设置,以便对于后续的每个请求都是相同的。
创建LocaleListener
要模拟区域设置存储在会话中,需要创建并注册一个新的事件监听器.监听器看起来是这样的。通常情况下,_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 / AppBundle / EventListener / LocaleListener.php名称空间AppBundle\EventListener;使用ob娱乐下载\组件\HttpKernel\事件\GetResponseEvent;使用ob娱乐下载\组件\HttpKernel\KernelEvents;使用ob娱乐下载\组件\EventDispatcher\EventSubscriberInterface;类LocaleListener实现了EventSubscriberInterface{私人$defaultLocale;公共函数__construct($defaultLocale=“en”){$这->defaultLocale =$defaultLocale;}公共函数onKernelRequest(GetResponseEvent$事件){$请求=$事件->getRequest ();如果(!$请求->hasPreviousSession ()) {返回;}//尝试查看locale是否被设置为_locale路由参数如果($语言环境=$请求->属性->get (“_locale”)) {$请求->getSession ()->集(“_locale”,$语言环境);}其他的{//如果这个请求没有显式的区域设置,使用会话中的一个$请求->setLocale ($请求->getSession ()->get (“_locale”,$这->defaultLocale));}}公共静态函数getSubscribedEvents(){返回数组(//必须在默认的Locale监听器之后注册KernelEvents::请求= >数组(数组(“onKernelRequest”,15)));}}
然后注册监听器:
- 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
//从控制器…使用ob娱乐下载\组件\HttpFoundation\请求;公共函数indexAction(请求$请求){$语言环境=$请求->getLocale ();}
根据用户的偏好设置语言环境
您可能希望进一步改进此技术,并基于登录用户的用户实体定义区域设置。然而,自从LocaleListener
在FirewallListener
,它负责处理身份验证和设置用户令牌TokenStorage
,您无法访问当前登录的用户。
假设你已经定义了a语言环境
你的财产用户
实体,您希望使用此作为给定用户的区域设置。要实现这一点,您可以钩子到登录过程中,并在用户会话被重定向到其第一个页面之前,用这个区域设置值更新用户会话。
方法的事件侦听器要做到这一点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
/ / src / AppBundle / EventListener / UserLocaleListener.php名称空间AppBundle\EventListener;使用ob娱乐下载\组件\HttpFoundation\会话\会话;使用ob娱乐下载\组件\安全\Http\事件\InteractiveLoginEvent;/** *在*登录后的会话中存储用户的语言环境。稍后LocaleListener可以使用它。* /类UserLocaleListener{/ * * *@var会话* /私人$会话;公共函数__construct(会话$会话){$这->会话=$会话;}/ * * *@paramInteractiveLoginEvent $event */公共函数onInteractiveLogin(InteractiveLoginEvent$事件){$用户=$事件->getAuthenticationToken ()->getUser ();如果(零= = !$用户->getLocale ()) {$这->会话->集(“_locale”,$用户->getLocale ());}}}
然后注册监听器:
- 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}
谨慎
类的更新后,为了在用户更改其语言首选项后立即更新语言,需要更新会话用户
实体。
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。