在 Symfony 上定义两条具有相同基础的路由

问题描述 投票:0回答:2

我有两条路线

GET /users/{id}
POST /users/{id}/file

当我尝试调用第二个(

POST /users/{id}/file
)时,我收到错误
405 Method Not Allowed

我使用 Symfony 6.4。

我的路线是用属性定义的:

# Get.php
#[Route('/users/{id}', name: 'get_user', methods: ['GET'], requirements: ['id' => '.+'])]
# AddFile.php
#[Route('/users/{id}/file', name: 'add_user_file', methods: ['POST'], requirements: ['id' => '.+'])]

我的

config/routes.yaml
文件:

home:
  path: /
  controller: App\Controller\HomeController

controllers:
  resource:
    path: ../src/Controller/
    namespace: App\Controller
  type: attribute
  prefix: /
  exclude:

当我使用

debug:router
命令时,我可以正确地看到我的两条路线。

姓名 方法 方案 主持人 路径
获取用户 获取 任何 任何 /用户/{id}
添加用户文件 发帖 任何 任何 /用户/{id}/文件

你知道我错过了什么吗?

symfony symfony-routing
2个回答
0
投票

路线不明确,因为

POST /users/{id}/file
将与两条路线路径相匹配。

Symfony 看到的第一条路线就是要匹配的路线,由于它无法处理

POST
,所以会出现错误。

您不能简单地决定属性定义的路由先加载哪个,因此您需要使用优先级参数

例如:

# Get.php
#[Route('/users/{id}',
      name: 'get_user',
      methods: ['GET'],
      requirements: ['id' => '.+'])]

# AddFile.php
#[Route('/users/{id}/file',
         name: 'add_user_file', 
         methods: ['POST'], 
         requirements: ['id' => '.+'], 
         priority: 1)]

这样,由于

add_user_file
的优先级高于
get_user
,因此将首先检查它。


-1
投票

正如您已经评论的那样,似乎第一个路由定义拦截了第二个,因为

{id}
也捕获
{id}/file
。对于这些情况,您的操作顺序很重要。因此,必须首先定义最具体的定义。确保
add_user_file
get_user
之前定义。

© www.soinside.com 2019 - 2024. All rights reserved.