Symfony 5中配置DateTimeNormalizer的最佳方式是什么
完全可以通过全局配置实现一次设置所有接口通用,不需要重复复制序列化初始化代码,两种常用实现方案如下:
方案1:通过framework.yaml配置(推荐,Symfony 5.1+支持)
这是最简单的实现方式,直接修改Symfony框架的序列化全局配置即可:
# config/packages/framework.yaml framework: serializer: default_context: datetime_format: 'Y-m-d'
方案2:通过services.yaml注册自定义DateTimeNormalizer
如果需要更灵活的Normalizer自定义配置,可以手动注册服务并设置优先级:
# config/services.yaml services: Symfony\Component\Serializer\Normalizer\DateTimeNormalizer: arguments: $defaultContext: DateTimeNormalizer::FORMAT_KEY: 'Y-m-d' tags: - { name: serializer.normalizer, priority: 100 }
接口代码优化
配置完成后不需要再手动实例化Serializer、Normalizer类,直接注入框架自带的SerializerInterface即可使用,原接口可简化为:
/** * @Route("/users/me", name="me", methods={"GET"}) */ public function me(SerializerInterface $serializer): JsonResponse { return JsonResponse::fromJsonString( $serializer->serialize($this->security->getUser(), 'json', [ AbstractNormalizer::GROUPS => ['me'], ]) ); }
后续其他实体的接口都可以直接注入SerializerInterface调用序列化方法,所有DateTime类型的属性都会自动按你配置的Y-m-d格式输出。如果有特殊接口需要临时修改日期格式,直接在序列化的上下文参数中覆盖配置即可:
// 临时使用自定义日期格式 $serializer->serialize($company, 'json', [ AbstractNormalizer::GROUPS => ['company'], DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s' ]);
内容的提问来源于stack exchange,提问作者ChessBarbarian
相关产品推荐
相关产品推荐

