You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:10:28