如何通过services.yaml配置自定义Serializer注入MyService
配置方法
你不能直接绑定默认的@serializer服务——这个是Symfony框架内置的全局序列化器,默认会加载所有已注册的normalizer、encoder,不符合你指定组件的自定义要求。你需要先在services.yaml中定义符合规则的自定义Serializer实例,再绑定到MyService即可,有两种常见写法:
写法1:拆分定义独立服务(适合这个自定义序列化器需要在多个服务中复用的场景)
在config/services.yaml的services节点下添加如下配置:
# 定义自定义序列化器依赖的组件 app.serializer.reflection_extractor: class: Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor app.serializer.object_normalizer: class: Symfony\Component\Serializer\Normalizer\ObjectNormalizer arguments: $propertyTypeExtractor: '@app.serializer.reflection_extractor' app.serializer.json_encoder: class: Symfony\Component\Serializer\Encoder\JsonEncoder # 组装符合要求的自定义Serializer实例 app.my_custom_serializer: class: Symfony\Component\Serializer\Serializer arguments: $normalizers: ['@app.serializer.object_normalizer'] $encoders: ['@app.serializer.json_encoder'] # 将自定义实例注入目标服务 App\Common\MyService: arguments: $serializer: '@app.my_custom_serializer'
写法2:内联匿名服务定义(适合仅MyService单独使用这个序列化器的场景)
不需要额外定义多个独立服务id,直接在MyService的参数配置里内联实例化逻辑即可,不会在容器中生成多余的公共服务:
App\Common\MyService: arguments: $serializer: class: Symfony\Component\Serializer\Serializer arguments: $normalizers: - class: Symfony\Component\Serializer\Normalizer\ObjectNormalizer arguments: $propertyTypeExtractor: class: Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor $encoders: - class: Symfony\Component\Serializer\Encoder\JsonEncoder
注意事项
以上配置是显式给MyService的$serializer参数指定绑定值,即使项目开启了自动装配(autowire),也不会影响其他依赖SerializerInterface的服务,其他服务仍然会正常注入框架默认的全局@serializer实例,不会产生注入冲突。
内容的提问来源于stack exchange,提问作者mat.twg
相关产品推荐
相关产品推荐

