带有注释的 Symfony 3 路由 + 区域设置侦听器 - 如何避免每个路由的重复“要求”


symfony 3 routing with annotations + locale listener - how to avoid duplicate "requirements" for every route?

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 中定义路由,但它应该使用注释同样工作。