【问题标题】:Symfony serialization: changing default DateTimeNormalizer formatSymfony 序列化:更改默认 DateTimeNormalizer 格式
【发布时间】:2019-10-29 14:36:48
【问题描述】:

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

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

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

是否可以更改默认的 DateTime 规范化格式以及如何更改?

实体类:

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

归一化示例:

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']),
        );
        ...
    }
}

【问题讨论】:

    标签: symfony datetime serialization normalization


    【解决方案1】:

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

    在我的例子中,相关键是'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']),
            );
            ...
        }
    

    【讨论】:

    • 我忘了我可以向上下文数组添加更多元素,在文档中找不到这个,非常感谢!
    【解决方案2】:

    这是另一个问题中的an answer。解决办法是:

    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 }
    

    优先级取自原始服务,因此,此方案不会有任何副作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 1970-01-01
      • 2014-09-30
      • 2016-01-25
      • 1970-01-01
      • 2012-03-17
      • 2013-09-01
      相关资源
      最近更新 更多