ApiPlatform装饰序列化器服务出现循环引用报错如何解决?
问题根因
你自定义的ApiNormalizer实现了Symfony的NormalizerInterface接口,在默认服务自动配置规则下,所有实现该接口的类都会被自动注册为全局序列化器的普通器。同时该类实现了SerializerAwareInterface,容器会自动向其注入全局序列化器实例。
全局序列化器的初始化依赖所有已注册的普通器(包括你自定义的ApiNormalizer),而ApiNormalizer的初始化又依赖全局序列化器,由此形成循环引用。
之前运行正常是因为Symfony/API Platform版本升级后,服务加载顺序、自动配置的检测规则发生了变化,才触发了这个循环引用报错。
解决方案
修改services.yaml配置,给这个装饰器服务关闭自动配置即可——这个类本来就只用来装饰API Platform特定的JSON-LD item普通器,不需要被全局序列化器识别:
App\Serializer\ApiNormalizer: decorates: 'api_platform.jsonld.normalizer.item' # 新增以下配置 autoconfigure: false
如果你的项目没有全局开启autowire,可以额外补充参数指定注入的装饰对象:
App\Serializer\ApiNormalizer: decorates: 'api_platform.jsonld.normalizer.item' arguments: $decorated: '@.inner' autoconfigure: false
验证
修改配置后执行php bin/console cache:clear清除缓存,报错就会消失,原有向序列化结果追加uuid的逻辑也完全不受影响。
内容的提问来源于stack exchange,提问作者Jack Skeletron
相关产品推荐
相关产品推荐

