symfony 3使用注释+语言环境监听器进行路由 - 如何避免重复"要求"对于每条路线?

时间:2016-01-26 18:04:39

标签: php symfony routing

清理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');
}

必须为每个操作重复此语法。有没有办法在不使用Bundle的情况下减少冗长?如果可能的话,我希望requirements部分驻留在某个配置中。

理想情况下,我想将defaults={"_locale"="en"}, requirements={"_locale"="%allowed_locales%"}部分移动到Locale Listener中,但是从我尝试的内容来看,似乎在路由匹配后调用了侦听器,因此不是可能,真的很遗憾。

1 个答案:

答案 0 :(得分:2)

是的,请查看Symfony Translations文档中How to Use Service Container Parameters in your Routes链接的The Locale and the 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中定义路由,但它应该使用注释工作相同。