我有两条路线
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}/文件 |
你知道我错过了什么吗?
路线不明确,因为
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
,因此将首先检查它。
正如您已经评论的那样,似乎第一个路由定义拦截了第二个,因为
{id}
也捕获 {id}/file
。对于这些情况,您的操作顺序很重要。因此,必须首先定义最具体的定义。确保 add_user_file
在 get_user
之前定义。