如何使用多个路由到一个控制器Symfony3的操作


How to use multiple routes to one controllerAction with Symfony3

我想在Controller中为一个Action配置多个URL(国际化目的)。

根据这个答案,在符号2中肯定有可能:

  1. 制作双注释管线
  2. 使用第三方捆绑包(例如"BeSimple's")

但我使用Symfony 3.0.3,这禁止我这样做,直到我更改路线名称(示例):

/**
 * @Route("/welcome", name="welcome", defaults={"_locale" = "en"})
 * @Route("/bienvenue", name="welcomeFR", defaults={"_locale" = "fr"})
 * @Route("/willkommen", name="welcomeDE", defaults={"_locale" = "de"})
 */

但是,在路由中添加额外的"FR/DE"字符会改变它们的存在,并破坏我在模板中的URL生成逻辑,我被迫在所有链接上进行:

{# homepage example #}
{% if _locale = 'en' %}
   {{ path('welcome') }}   {# Routes from set only for "en" #}
{% elseif _locale = 'fr' %}
   {{ path('welcomeFR') }} {# "fr" only links #}
{% endif %} {# and so on #}

有人找到这个问题的正确解决方案吗?

AFAIK,这是将多个路由指向唯一控制器操作的首选方式。因此,您当前的问题是重新生成当前路径,这取决于使用的路由

如果您使用{{app.request.get('_route')}}来获取当前路由的名称,也许您不必修改您的逻辑。这样,你可以使用:

{{ path(app.request.get('_route')) }}

更新:

为每条路线创建一个动作并将其转发到主语言动作怎么样?也许这不是最好的做法,但可以很好地工作

/**
 * @Route("/welcome", name="welcome", defaults={"_locale" = "en"})
 */
public function welcomeAction()
{
    /* code here */
}
/**
 * @Route("/bienvenue", name="welcomeFR", defaults={"_locale" = "fr"})
 */
public function welcomeFrAction()
{
    $response = $this->forward('AppBundle:ControllerName:welcome');
}
/*
 * @Route("/willkommen", name="welcomeDE", defaults={"_locale" = "de"})
 */
public function welcomeDeAction()
{
    $response = $this->forward('AppBundle:ControllerName:welcome');
}

在Symfony3上浪费了10个小时寻找解决方案后,我做出了以下假设:

  • 没有一个路线技巧与完全相同的";name"不起作用

任何一种类似双注释,双";路由.yml";导入时,基于主机的匹配会产生相同的效果-只有一条路由匹配,通常是最后一条。在我的例子中会是("/willkommen",name="welcomeDE")。

  • 两个i18n捆绑包都不能通过版本控制约束在Symfony3上运行

Composer甚至不让我们安装捆绑包。

  • Locale Listener and Loader(Routing Component)正在缓存

我的解决方案是匹配"_区域设置";并将其传递给LocaleLoader;routing_en.yml/routing_fr.yml";等文件分别被Symfony缓存在第一次匹配之后_区域设置";不会影响路线的映射。

总结

Symfony3似乎不支持路由";示例";其中多于一个";url";完全通过约束和缓存。

在失望之后,我正在考虑回到Symfony 2.8,不知道是什么让Symony的大师们阻止";双注释";解决方案以及他们目前对链接国际化的想法是什么

希望有一天可以用S3实现,因为链接i18n是非常常见的SEO实践。

编辑:已确认,使用BeSimple的i18n在2.8.5上运行得很有魅力