为什么Symfony 5控制器需继承AbstractController才能实现自动装配?
报错原因
这是Symfony框架服务容器的默认规则导致的,核心逻辑如下:
- Symfony默认对所有继承
AbstractController的控制器做了特殊处理:自动添加controller.service_arguments标签,同时将其标记为公共服务,允许路由组件直接从容器中拉取控制器实例。 - 没有继承
AbstractController的自定义控制器,默认会被判定为普通私有服务,Symfony服务容器不允许外部直接获取私有服务实例,路由匹配后尝试实例化控制器时就会抛出上述报错。 - 报错提示提到的
controller.service_arguments标签,作用是开启控制器的参数自动注入能力,没有这个标签时,控制器构造函数、方法中的类型提示服务注入也不会正常生效。
不继承AbstractController的解决方法
如果不需要使用AbstractController提供的快捷方法,可以通过两种方式修复报错:
- 手动修改服务配置:在
config/services.yaml中给对应控制器添加标签并设置为公共服务,单控制器示例配置如下:
services: App\Controller\TestController: tags: ['controller.service_arguments'] public: true
如果需要全局生效所有自定义控制器,可以配置为:
services: App\Controller\: resource: '../src/Controller/' tags: ['controller.service_arguments'] public: true
- 使用原生属性声明:Symfony 5.3及以上版本可以直接在控制器类上添加
#[AsController]属性,框架会自动完成打标签、设置公共服务的操作,不需要修改yaml配置。
只要开启了服务自动配置(autoconfigure,Symfony默认开启),添加
#[AsController]后不需要做其他额外配置即可正常使用。
内容的提问来源于stack exchange,提问作者Olivier Meunier
相关产品推荐
相关产品推荐

