Symfony5.4访问路由报错:控制器不可调用 既非服务也非类
核心触发原因
路由配置中控制器类名的命名空间分隔符使用错误。
你在@MlngAppBundle/Location/Api/Resources/config/routing.xml中配置_controller参数时,用正斜杠/分割命名空间:
<default key="_controller">MlngApp/MlngAppBundle/Location/Api/Controller/AnotherController::anotherEndpoint</default>
PHP原生命名空间、Symfony的服务/类解析规则都要求用反斜杠\作为命名空间分隔符,你写的字符串会被直接当成类名查找,自然匹配不到任何已存在的类或服务,直接抛出你看到的报错。
分步修复
1. 修正路由中的控制器命名
把路由配置里的正斜杠全替换为反斜杠即可,XML语法中反斜杠不需要额外转义:
<default key="_controller">MlngApp\MlngAppBundle\Location\Api\Controller\AnotherController::anotherEndpoint</default>
2. 补全控制器服务注册的缺失参数
你在Common目录services.xml中注册控制器的prototype配置缺了三个必要参数,会导致后续控制器依赖注入、服务访问失败,和同文件内Repository的注册配置对齐,补全autowire、autoconfigure、public三个属性:
<!-- controllers --> <prototype namespace="MlngApp\MlngAppBundle\" resource="../../../../../../../src/MlngApp/MlngAppBundle/{Common,Event,Location,People,User}/Api/Controller" autowire="true" autoconfigure="true" public="true" > <tag name="controller.service_arguments" /> <call method="setContainer"> <argument type="service" id="service_container"/> </call> </prototype>
补充说明:根目录config/services.yaml里的全局自动加载规则本来就已经覆盖了src/MlngApp/MlngAppBundle下的所有目录,Api/Controller不在exclude排除列表内,本身就会被自动注册为服务,这步XML配置只要参数正确,和全局规则不会产生冲突。
3. 修正控制器返回值规范
你当前控制器方法直接用echo输出内容不符合Symfony的请求处理流程,会触发响应异常,改成返回Symfony标准Response对象:
<?php namespace MlngApp\MlngAppBundle\Location\Api\Controller; use FOS\RestBundle\Controller\AbstractFOSRestController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; class AnotherController extends AbstractFOSRestController { public function anotherEndpoint(Request $request): Response { return new Response("do nothing"); } }
验证操作
所有修改完成后执行以下命令清除配置缓存,避免旧缓存干扰:
php bin/console cache:clear
再执行路由调试命令确认配置生效:
php bin/console debug:router testingstuff
如果输出结果中_controller字段显示为正确的带反斜杠的类名+方法名,访问对应地址即可正常返回内容。
内容的提问来源于stack exchange,提问作者Rafa

