Symfony 3框架的干净设置,从这里添加了语言环境侦听器:http://symfony.com/doc/current/cookbook/session/locale_sticky_session.html
示例操作代码:
/**
* @Route("/foo/")
* @Route("/{_locale}/foo/", name="foo", requirements={"_locale"="en|ru|tk"})
*/
public function fooAction(Request $request)
{
return new Response('true');
}
必须为每个操作重复此语法。有没有办法在不使用捆绑包的情况下使其不那么冗长?如果可能的话,我希望requirements
部分驻留在某个地方的配置中。
理想情况下,我想在区域设置侦听器中移动defaults={"_locale"="en"}, requirements={"_locale"="%allowed_locales%"}
部分,但从我尝试的内容来看,似乎在路由匹配后调用侦听器,因此这是不可能的,这真的是一种耻辱。
是的,请查看如何在路由中使用服务容器参数,该参数链接自Symfony翻译文档中的语言环境和URL,并指出:
阅读如何在路由中使用服务容器参数,了解如何避免在所有路由中硬编码_locale要求。
您基本上可以在全局参数中设置这些路由,如下所示:
# app/config/config.yml
parameters:
app.locales: en|ru|tk
然后在路由注释中执行以下操作:
/**
* @Route("/foo/")
* @Route("/{_locale}/foo/", name="foo", requirements={"_locale"="%app.locales%"})
*/
public function fooAction(Request $request)
{
return new Response('true');
}
我不确定为什么文档只显示用于在 YAML/XML/PHP 中定义路由,但它应该使用注释同样工作。