调用API时提示“There are no registered paths for namespace 'App'”问题求助
咱们先来梳理下你碰到的两个核心问题:一是FOSRestBundle总绕不开Twig视图渲染,二是弹出命名空间"App"无注册路径的报错。结合你用FOSUserBundle的场景和给出的配置,给你几个落地的解决步骤:
1. 调整FOSRestBundle的格式监听器规则
你当前的format_listener只针对/api/test路径做了JSON格式处理,剩下的所有请求(包括FOSUserBundle的路由)都直接stop: true,这就导致非/api/test的API请求会触发Twig渲染逻辑。建议把API路径的匹配范围扩大,确保所有API请求都能被正确识别:
fos_rest: param_fetcher_listener: true body_listener: true format_listener: rules: - { path: '^/api', priorities: ['json'], fallback_format: json, prefer_extension: false } - { path: '^/', priorities: ['html'], fallback_format: html, prefer_extension: true } view: templating_formats: html: false default_engine: none view_response_listener: 'force' mime_types: json: ['application/json'] # 补全你之前未写完的MIME类型配置
把API路径统一匹配^/api,而非单个/api/test,这样所有API请求都会优先处理JSON格式,不会触发Twig的渲染流程。
2. 适配FOSUserBundle的路由配置
FOSUserBundle的默认路由挂载在根路径/下,如果你想让这些路由也支持REST风格(比如登录、注册的API接口),需要在导入路由时加上API前缀和默认格式:
# config/routes.yaml fos_user: resource: "@FOSUserBundle/Resources/config/routing/all.xml" prefix: /api/user # 给FOSUserBundle路由加上API前缀,让它被上面的format_listener规则覆盖 defaults: _format: json # 默认强制使用JSON格式返回
这样FOSUserBundle的请求会被当作API请求处理,不会再去寻找Twig模板。
3. 修复"There are no registered paths for namespace 'App'"报错
这个错误大多是因为你的API控制器没有正确对接FOSRestBundle的视图系统,或者路由配置有问题。你可以这么做:
- 让你的API控制器继承
FOS\RestBundle\Controller\AbstractFOSRestController - 在控制器方法里用
@View()注解明确指定返回格式,示例代码如下:
// src/Controller/Api/TestController.php namespace App\Controller\Api; use FOS\RestBundle\Controller\AbstractFOSRestController; use FOS\RestBundle\View\View; use Symfony\Component\HttpFoundation\Response; class TestController extends AbstractFOSRestController { public function testAction() { $responseData = ['status' => 'success', 'message' => 'Hello from API']; return View::create($responseData, Response::HTTP_OK); } }
另外还要检查你的路由是否正确注册,确保控制器的路由都在/api前缀下,没有拼写错误的命名空间。
4. 确保禁用Twig渲染的配置生效
你的view配置里已经设置了templating_formats.html: false和default_engine: none,但如果还是有问题,可以在路由里添加_format: json默认值,或者在控制器方法里直接返回JSON响应,进一步强制跳过Twig渲染。
内容的提问来源于stack exchange,提问作者woj oj

