Symfony 6.1自定义Denormalizer装饰ArrayDenormalizer遇循环依赖问题
Symfony 6.1自定义Denormalizer解决循环依赖问题
你遇到的循环引用问题,根源在于使用DenormalizerAwareTrait会让Symfony注入整个Denormalizer链,而你的自定义Denormalizer本身就是这个链的一员,导致依赖闭环。正确的做法是直接注入你要装饰的ArrayDenormalizer,而非整个链。
修改后的代码
去掉DenormalizerAwareInterface和对应的Trait,改用构造函数注入ArrayDenormalizer:
<?php namespace App\Serializer; use App\MyEntity; use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer; use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; class PreCheckRequestDenormalizer implements DenormalizerInterface { public function __construct(private ArrayDenormalizer $arrayDenormalizer) { } public function denormalize(mixed $data, string $type, string $format = null, array $context = []) { // 增加isset判断避免数组键不存在时报错 if (isset($data['locale']) && !in_array($data['locale'], ['de', 'en'])) { $data['locale'] = 'en'; } return $this->arrayDenormalizer->denormalize($data, $type, $format, $context); } public function supportsDenormalization(mixed $data, string $type, string $format = null) { return is_array($data) && $type === MyEntity::class; } // Symfony 6+要求实现getSupportedTypes方法,明确支持的类型 public function getSupportedTypes(?string $format): array { return [ MyEntity::class => true, ]; } }
配置优先级
在config/services.yaml中给自定义Denormalizer设置更高优先级,确保它在ArrayDenormalizer之前被调用:
services: App\Serializer\PreCheckRequestDenormalizer: tags: - { name: serializer.normalizer, priority: 100 }
默认ArrayDenormalizer的优先级是0,设置100能保证你的自定义逻辑先执行,处理完数据后再交给ArrayDenormalizer完成后续反序列化。
这样修改后,依赖关系变成了PreCheckRequestDenormalizer → ArrayDenormalizer,不存在循环引用,Nginx 502的问题就能解决。
内容的提问来源于stack exchange,提问作者ivoba
相关产品推荐
相关产品推荐

