使语言环境在用户会话期间“粘性”
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
使语言环境在用户会话期间“粘性”
Symfony 2ob娱乐下载.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 / Acme / LocaleBundle / EventListener / LocaleListener.php名称空间Acme\LocaleBundle\EventListener;使用ob娱乐下载\组件\HttpKernel\事件\GetResponseEvent;使用ob娱乐下载\组件\HttpKernel\KernelEvents;使用ob娱乐下载\组件\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”,17)));}}
然后注册侦听器:
1 2 3 4 5 6
服务:acme_locale.locale_listener:类:Acme \ LocaleBundle \ EventListener \ LocaleListener参数:[" % kernel.default_locale % "]标签:- - - - - -{名称:kernel.event_subscriber}
1 2 3 4 5 6
<服务id=“acme_locale.locale_listener”类=“Acme \ LocaleBundle \ EventListener \ LocaleListener”><论点>% kernel.default_locale %< /论点><标签的名字=“kernel.event_subscriber”/ >< /服务>
1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\DependencyInjection\定义;美元容器- >setDefinition (“acme_locale.locale_listener”,新定义(“Acme \ LocaleBundle \ EventListener \ LocaleListener”,数组(“% kernel.default_locale %”)))- >addTag (“kernel.event_subscriber”);
就是这样!现在庆祝通过改变用户的语言环境,看到它是粘在整个请求。记住,得到用户的语言环境,总是使用要求::getLocale方法:
1 2
/ /从一个控制器…美元语言环境=美元这- >getRequest ()- >getLocale ();
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。