如何向主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
相关产品推荐
相关产品推荐

