Symfony表单QcmType无法自动装配服务 ObjectManager不存在报错如何解决?
问题根源
- services.yaml配置顺序错误,
_defaults规则放在自定义服务配置之后,前面的自定义服务不会应用自动装配、自动配置的默认规则。 - 手动配置的服务类路径与实际QcmType的命名空间不符:你配置的类路径是
App\Form\Type\QcmType,但报错显示实际类路径为App\Form\QcmType,配置完全未生效,Symfony依然在尝试自动装配该类。 - Symfony默认没有为
Doctrine\Persistence\ObjectManager接口设置自动装配别名,自动装配时无法匹配到对应的实体管理器服务。
解决方案
方案1:添加全局接口别名(推荐,无需单独配置表单类)
直接给ObjectManager接口设置全局别名,所有需要注入该接口的服务都可以自动装配,无需单独配置:
services: # _defaults 必须放在所有服务配置的最前面 _defaults: autowire: true autoconfigure: true public: false # 添加接口别名 Doctrine\Persistence\ObjectManager: '@doctrine.orm.default_entity_manager' # 保留原有的全局服务扫描配置即可 App\: resource: '../src/' exclude: - '../src/DependencyInjection/' - '../src/Entity/' - '../src/Kernel.php'
改完后删除你之前单独写的app.form.type.qcm配置即可,表单类会被自动扫描加载,依赖自动注入。
方案2:修正手动服务配置
如果你不想设置全局别名,可以修正你现有的手动配置,保证类路径匹配、配置顺序正确:
services: # 依然要把_defaults放在最前面 _defaults: autowire: true autoconfigure: true # 类路径要和实际QcmType的命名空间完全一致 App\Form\QcmType: arguments: $manager: '@doctrine.orm.entity_manager' tags: - { name: form.type }
额外检查项
确认QcmType头部的use语句引用的是正确的命名空间:
use Doctrine\Persistence\ObjectManager;
不要使用旧版的Doctrine\Common\Persistence\ObjectManager,该命名空间在Doctrine 2.10+版本后已被废弃移除。
内容的提问来源于stack exchange,提问作者Dezz H
相关产品推荐
相关产品推荐

