如果你在 Symfony 中有 2 条相同的路由怎么办?

Posted

技术标签:

【中文标题】如果你在 Symfony 中有 2 条相同的路由怎么办?【英文标题】:What if you have 2 identical routes in Symfony? 【发布时间】:2021-10-27 17:36:15 【问题描述】:

我正在尝试了解 Symfony 5 路由的工作原理。

如果在我的项目中我有 2 个具有相同路由名称的不同控制器会发生什么?

例如在Controller1.php中:

/**
 * @Route("/publisher/notification_update/")
 */

在Controller2.php中:

 /**
 * @Route("/publisher/notification_update/")
 */

然后从树枝内的某个地方,我有一个表单,如下调用此路由:

<form name="notification" id="notificationmessage.notification_id"  
        action="/publisher/notification_update/" style="display:none"
        method="post">
        <input hidden class="hiddenNotificationsForUser" type="text" id="message.notification_id"
            value="message.message" onclick="this.form.submit();" />
</form>

在这种情况下会发生什么?会出现错误,还是会转到按字母顺序找到的第一条路线?

【问题讨论】:

我想你可以尝试一下,看看会发生什么 ;) 破坏发现的乐趣:你不会得到错误,并且使用第一个匹配项 (Controller1)。 这也可能有用:symfony.com/doc/current/routing.html#priority-parameter 并且路由不按字母顺序匹配,而是按照它们定义的顺序与可选优先级匹配。 bin/console debug:router 将向您显示已定义的路由以及它们匹配的顺序。 【参考方案1】:

在 DigitalOcean 的 LEMP 服务器上使用 Symfony 5 重现此场景后,我发现没有错误或警告消息。

Symfony 选择了 Controller1.php 中指定的路由:

/**
* @Route("/publisher/notification_update/")
*/

然而,这是一件坏事,因为将我描述的情况与大型代码库结合起来可能会导致非常难以识别的错误。 即使所有内容都正确,您也可能永远无法到达您需要的路线。

【讨论】:

路由器允许ordering,因此可以允许多个路由具有该模式。没有检查器来确定特定的路由模式,并且尚未定义属性(这发生在我身上)。这对我来说似乎很合适,并且可能表明域组织的气味不仅仅是编译错误。

以上是关于如果你在 Symfony 中有 2 条相同的路由怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony:具有不同参数的多个路由,默认为空

Symfony 4.3 路由问题 - 每条路由都与 urlRedirectAction 匹配

装daphile路由器上挂硬盘怎设置

从 Symfony2 中的 routing.yml 将一条路由重定向(301)到另一条路由

如何防止访问 Symfony 2 中的特定路由

如何在 symfony 2 中获取根路由