Symfony+FosRestBundle:POST/DELETE请求报App命名空间无注册路由
嘿,这个报错我之前也碰到过,大概率是FOSRestBundle的路由命名空间和你的控制器配置没对上——毕竟GET能跑通说明基础路由是好的,POST/DELETE出问题一般是注解或路由配置的细节没处理好。结合你给的config.yml配置,我给你几个排查方向:
1. 核对控制器的命名空间与路由注解
先检查你的控制器类的命名空间是不是AppBundle\Controller,还有路由注解里的namespace参数有没有写错。比如你的POST控制器应该是这样的:
// src/AppBundle/Controller/YourController.php namespace AppBundle\Controller; use FOS\RestBundle\Controller\Annotations as Rest; class YourController { /** * @Rest\Post("/api/your-endpoint") * 如果不需要指定命名空间可以直接去掉下面这行,避免冲突 * @Rest\Route(requirements={"_format"="json"}, namespace="App") */ public function postYourAction() { // 你的业务逻辑 } }
重点:如果你的路由没有特殊命名空间需求,直接删掉@Rest\Route里的namespace参数反而更稳妥,让FOSRestBundle自动识别控制器的命名空间就行。
2. 检查路由配置文件的导入规则
打开你的routing.yml,确保正确导入了AppBundle的REST路由,并且格式设置正确:
# app/config/routing.yml app_rest_api: resource: "@AppBundle/Controller/" type: rest prefix: /api defaults: { _format: json } requirements: { _format: json }
这里的type: rest是关键,它告诉FOSRestBundle去解析控制器里的REST注解路由。另外别在这里乱加namespace参数,不然很容易和控制器的命名空间冲突。
3. 确认Symfony的路由自动映射开启
如果你用的是Symfony 3.x及更早版本,得确保config.yml里的路由自动映射是开着的:
# app/config/config.yml framework: router: auto_mapping: true
这个配置会自动加载所有Bundle里的路由配置,包括FOSRestBundle的注解路由,少了它的话POST/DELETE路由可能不会被注册。
4. 清缓存!清缓存!清缓存!
修改完配置或注解后,一定要清缓存,不然Symfony还是会用旧的配置。执行对应的命令:
# 开发环境 php bin/console cache:clear --env=dev # 生产环境 php bin/console cache:clear --env=prod
5. 用debug命令排查路由
最后,你可以用这个命令查看所有已注册的路由,确认POST/DELETE请求对应的路由是否存在,以及它们的命名空间是不是App:
php bin/console debug:router
如果找不到对应的POST/DELETE路由,那说明你的注解或路由配置肯定哪里错了,对着输出仔细核对就行。
内容的提问来源于stack exchange,提问作者rmsluimers

