Сериализация Symfony: изменение формата DateTimeNormalizer по умолчанию - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь сериализовать класс сущностей, который имеет некоторые поля \ DateTime. Все работает нормально, но объекты \ DateTime преобразуются в строку, используя следующий формат: «2019-10-21T01: 05: 12 + 00: 00», в то время как я хотел бы получить только часть даты: «2019-10-21».

Symfony документация упоминает формат по умолчанию, но не объясняет, как его настроить:

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

1 Ответ

0 голосов
/ 30 октября 2019

Оказывается, что массив '$ 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']),
        );
        ...
    }
...