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

如何向主Serializer传递自定义Normalizer数组?配置求助

解决Symfony Serializer注入RewindableGenerator类型Normalizer的问题

问题核心

Symfony Serializer的构造函数要求传入Normalizer实例的数组,但通过服务标签注入的iterable是RewindableGenerator类型,无法直接使用。以下是具体修复方案:


步骤1:确保自定义Normalizer被正确注册为服务并打标签

修改NormalizerServiceProvider,循环$normalizers数组,将每个Normalizer类注册为容器服务,同时打上normalizers标签:

abstract class NormalizerServiceProvider extends ServiceProvider
{
    protected array $normalizers = [];

    public function register()
    {
        // 注册所有自定义Normalizer为单例服务,自动处理依赖注入
        foreach ($this->normalizers as $normalizerClass) {
            $this->app->singleton($normalizerClass);
            $this->app->tag($normalizerClass, 'normalizers');
        }

        // 注册SerializerService时,注入所有标记为normalizers的服务数组
        $this->app->singleton(SerializerService::class, function ($app) {
            $normalizerInstances = $app->tagged('normalizers');
            return new SerializerService($normalizerInstances);
        });
    }
}

步骤2:调整SerializerService的构造逻辑

如果无法修改服务注册方式,可在SerializerService内部将iterable转为数组后传入Symfony Serializer:

use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;

class SerializerService
{
    private Serializer $serializer;

    public function __construct(iterable $normalizers)
    {
        // 将迭代器转为数组,适配Symfony Serializer的参数要求
        $normalizerArray = iterator_to_array($normalizers);
        $encoders = [new JsonEncoder()]; // 根据业务需求添加编码器

        $this->serializer = new Serializer($normalizerArray, $encoders);
    }

    // 业务方法示例
    public function serialize($data): string
    {
        return $this->serializer->serialize($data, 'json');
    }
}

额外注意事项

  • 所有自定义Normalizer必须实现Symfony的NormalizerInterface或DenormalizerInterface,否则Symfony Serializer无法识别。
  • 若使用Symfony框架而非Laravel,可在services.yaml中直接配置标签注入数组:
    services:
        # 自动给所有Normalizer接口实现类打标签
        _instanceof:
            Symfony\Component\Serializer\Normalizer\NormalizerInterface:
                tags: ['normalizers']
    
        App\Serializer\SerializerService:
            arguments:
                # !tagged 返回数组而非生成器
                $normalizers: !tagged 'normalizers'
    

内容的提问来源于stack exchange,提问作者Mitsukk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:24:27