gpt4 book ai didi

php - 如何使用注入(inject)的 SerializerInterface 配置 Normalizer

转载 作者:行者123 更新时间:2023-12-02 02:33:34 25 4
gpt4 key购买 nike

我知道我可以使用和配置例如Symfony 的 Serializer 的 DateTimeNormalizer 是这样的:

$serializer = new Serializer(array(new DateTimeNormalizer()));

$dateAsString = $serializer->normalize(
new \DateTime('2016/01/01'),
null,
array(DateTimeNormalizer::FORMAT_KEY => 'Y/m')
);
// $dateAsString = '2016/01';

但是如果我想在没有实例化的情况下使用序列化器,而是使用“完整的 Symfony 应用程序”依赖注入(inject),而不是像:

//class MyService...

public function __construct(SerializerInterface $serializer)
{
$this->serializer = $serializer;
}

//function MyFunction()
{
$json = $this->serializer->serialize($object, 'json');
}

它已经以预先订购的方式提供了最常见的标准化器。

通常这对我来说完全没问题。

但是我怎么能在注入(inject)场景中配置 DateTimeNormalizer::FORMAT_KEY 而不创建 CustomNormalizer 或大量实例化?

最佳答案

我刚刚完成了一个类似问题的项目冲刺。

如果您只想默认格式化 DateTime 对象,您可以在配置文件中添加这些行:

services:
serializer.normalizer.datetime:
class: ‘Symfony\Component\Serializer\Normalizer\DateTimeNormalizer
arguments
-
!php/const Symfony\Component\Serializer\Normalizer\DateTimeNormalizer::FORMAT_KEY: 'Y-m-d\TH:i:s.uP’
tags:
- { name: serializer.normalizer, priority: -910 }

但是如果你想要更多的灵 active 和对序列化器的控制,我建议你不要修改配置文件,而是尝试下面的方法:

因此,根据我的需要,我最终创建了一个扩展 AbstractController 的 MainController,并且我的每个 Controller 都扩展了 MainController。

在 MainController 中,我将序列化程序实例化为属性,以便您可以通过 $this->serializer 访问已在 MainControlle 中配置的序列化程序。

主 Controller :

class MainController extends AbstractController {
protected $serializer;

public function __construct() {
$encoders = [new XmlEncoder(), new JsonEncoder()];
$normalizers = [
new DateTimeNormalizer([DateTimeNormalizer::FORMAT_KEY => "your date format"]),
new ObjectNormalizer()
];

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

后 Controller :

class PostController extends MainController {

/**
* @Route("/posts")
**/
public function listPosts() {

$e = new Entity();

return $this->serializer->serialize($e, "json");
}
}

编辑:!!我忘了说,要注意你在实例化中安排归一化器的顺序。由于 DateTime 是一个对象,如果先添加 ObjectNormalizer(用于规范化实体),序列化程序将首先尝试使用 ObjectNormalizer 规范化 DateTime 对象,并返回一个空数组。

关于php - 如何使用注入(inject)的 SerializerInterface 配置 Normalizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64665924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com