Как я могу использовать datetimeNormalizer в Symfony 4? - PullRequest
0 голосов
/ 22 декабря 2018

Это мой контроллер:

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

Работает хорошо, но я получаю предупреждение:

Пользователь устарел: передача параметров конфигурации непосредственно в конструктор не рекомендуется, посколькуSymfony 4.2, используйте вместо этого контекст по умолчанию.

1 Ответ

0 голосов
/ 22 декабря 2018

Проблема заключается в том, как вы строите свой сериализатор, а точнее DateTimeNormalizer.Вы можете видеть ошибку , которая запускается в конструкторе этого класса всякий раз, когда не предоставлен контекст.

Простым решением было бы передать массив в качестве первого аргумента:

new Serializer(
    array(
        new DateTimeNormalizer(array('datetime_format' => 'd.m.Y')),
        new GetSetMethodNormalizer()
    ),
    array(
        'json' => new JsonEncoder()
    )
);

Так что просто замените d.m.Y на array('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']

В вашем контроллере вы можете просто ввести свой сериализатор, изменив имя аргумента

public function index($slug, Request $request, SerializerInterface $dateSerializer)

Фактически, где бы вы ни хотели использовать этот сериализатор, вы можете получить его, просто вставив его с SerializerInterface $dateSerializer спасибок привязке в конфигурации вашего сервиса.

Примечание: привязка будет работать только с Symfony 4.2.В более старых версиях вы должны удалить тип в начале (SerializerInterface), так как это новая функция.Я думаю, что все остальное должно работать с Symfony 3.4 и 4.0.

...