Symfony7升级后调用接口报错:无法为__setInitialized()添加#[Ignore]
Symfony 7 + Doctrine 3 关联实体加载报错排查
问题背景
升级Symfony 7.0 + Doctrine ORM 3.0后,调用接口通过UserRepository::findBy()加载关联Role实体的User对象时,触发报错:
无法为"Proxies\CG\App\Entity\Role::__setInitialized()"添加#[Ignore]。仅可为以"get"、"is"、"has"或"set"开头的方法添加Ignore。
代码中未手动添加#[Ignore]属性,但排查发现Doctrine的LazyGhostTrait.php文件内存在该注解。
问题原因
这不是Symfony的Bug,是Doctrine 3.0初始版本的Lazy Ghost代理实现与Symfony 7序列化组件的兼容性问题:
- Doctrine 3.0早期版本的
LazyGhostTrait中,给__setInitialized()这类内部方法添加了#[Ignore]注解; - Symfony 7的序列化组件对
#[Ignore]注解的使用做了严格校验,仅允许标注在以get/is/has/set开头的方法上,因此触发错误。
解决方法
方法1:升级Doctrine ORM版本
将Doctrine ORM升级到3.0.1及以上版本,该版本已修复此问题——移除了非标准命名方法上的#[Ignore]注解,调整了代理类的注解实现逻辑。
方法2:配置Symfony序列化忽略特定属性
在config/packages/serializer.yaml中添加配置,忽略代理类的内部方法:
framework: serializer: default_context: ignore_attributes: ['__isInitialized__', '__setInitialized__']
方法3:禁用Lazy Ghost代理
在Doctrine配置中关闭Lazy Ghost代理功能(仅作为临时 workaround,不推荐长期使用):
doctrine: orm: proxy_dir: '%kernel.cache_dir%/doctrine/orm/Proxies' proxy_namespace: Proxies lazy_ghost_objects: false
内容的提问来源于stack exchange,提问作者Jan Doornbos
相关产品推荐
相关产品推荐

