Symfony 序列化:更改默认的 DateTimeNormalizer 格式

kut*_*tas 2 serialization datetime normalization symfony

我正在尝试序列化一个具有一些 \DateTime 字段的实体类。一切正常,但 \DateTime 对象使用以下格式转换为字符串:“2019-10-21T01:05:12+00:00”,而我只想获取日期部分:“2019-10-21 ”。

Symfony文档提到了默认格式,但没有解释如何配置它:

DateTimeNormalizer此规范化器将 DateTimeInterface 对象(例如 DateTime 和 DateTimeImmutable)转换为字符串。默认情况下,它使用 RFC3339 格式。

是否可以更改默认的日期时间规范化格式以及如何更改?

实体类:

class Fact
{
    /**
     * @ORM\Column(type="datetime", options={"default": "CURRENT_TIMESTAMP"})
     * @Groups({"api"})
     */
    private $created_on;
}
Run Code Online (Sandbox Code Playgroud)

标准化示例:

use Symfony\Component\Serializer\SerializerInterface;

class FactController extends AbstractController
{
    private $serializer;

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

    public function view($id)
    {
        ....   
        $data = array(
            'fact' => $this->serializer->normalize($fact, null, ['groups'=> 'api']),
        );
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

kut*_*tas 6

事实证明,“$context”数组被传递给每个受支持的规范化器的 normalize() 函数。内置规范化器定义它们接受的数组键及其默认值。

在我的例子中,相关的键是'datetime_format',默认为\DateTime::RFC3339\DateTime::format()格式必须是和方法接受的格式\DateTime::createFromFormat()- 这些函数用于规范化/非规范化。

在我的例子中正确的用法是:

    public function view($id)
    {
        ....   
        $data = array(
            'fact' => $this->serializer->normalize($fact, null, ['groups'=> 'api',
                                                                 'datetime_format' => 'Y-m-d']),
        );
        ...
    }
Run Code Online (Sandbox Code Playgroud)