如何在 Symfony 4 中使用 datetimeNormalizer?

2 serialization entity symfony

这是我的控制器:

use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;


public function index($slug, Request $request, SerializerInterface $serializer)
  {
    $table = $this->getDoctrine()->getRepository($EntityName)->findAll();
    $serializer = new Serializer(array(new DateTimeNormalizer('d.m.Y'), new GetSetMethodNormalizer()), array('json' => new JsonEncoder()));
    $data = $serializer->serialize($table, 'json');
    return $this->render('index.html.twig', ['data' => $data]);
  }
Run Code Online (Sandbox Code Playgroud)

它运行良好,但我收到警告:

用户弃用:自 Symfony 4.2 起,不推荐将配置选项直接传递给构造函数,而是使用默认上下文。

dbr*_*ann 5

问题在于如何构建 Serializer,更具体地说是 DateTimeNormalizer。当没有提供上下文时,您可以看到该类的构造函数中触发的错误。

简单的解决方法是将数组作为第一个参数传递:

new Serializer(
    array(
        new DateTimeNormalizer(array('datetime_format' => 'd.m.Y')),
        new GetSetMethodNormalizer()
    ),
    array(
        'json' => new JsonEncoder()
    )
);
Run Code Online (Sandbox Code Playgroud)

所以只需替换d.m.Yarray('datetime_format' => 'd.m.Y').

由于无论如何您都会传入 SerializerInterface,因此您可能需要在 services.yaml 中配置序列化器:

services:
    _defaults:
        ... # other default settings
        bind:
            Symfony\Component\Serializer\SerializerInterface $dateSerializer: '@app.date_serializer'

    Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer: ~
    Symfony\Component\Serializer\Encoder\JsonEncoder: ~

    app.date_normalizer:
        class: Symfony\Component\Serializer\Normalizer\DateTimeNormalizer
        arguments:
            - { 'datetime_format': 'd.m.Y' }

    app.date_serializer:
        class: Symfony\Component\Serializer\Serializer
        arguments:
            - ['@app.date_normalizer', '@Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer']
            - ['@Symfony\Component\Serializer\Encoder\JsonEncoder']
Run Code Online (Sandbox Code Playgroud)

在您的控制器中,您可以通过更改参数名称来注入序列化器

public function index($slug, Request $request, SerializerInterface $dateSerializer)
Run Code Online (Sandbox Code Playgroud)

事实上,无论您想在哪里重用该序列化器,您都可以通过注入它来获取它,这SerializerInterface $dateSerializer要归功于服务配置中的绑定。

请注意,绑定仅适用于 Symfony 4.2。在旧版本中,您必须删除开头的类型(SerializerInterface),因为这是一项新功能。我认为所有其他东西都应该适用于 Symfony 3.4 和 4.0。