JMS Serializer не применяет форматирование к вновь созданным объектам

При получении объекта из API я получаю правильно сериализованный объект Course.

"startDate": "2018-05-21",

Но когда я создаю новый объект и пытаюсь его вернуть, форматирование не применяется.

"startDate": "2019-02-01T02:37:02+00:00",

Даже если я использую репозиторий для получения нового объекта Course, если это тот же самый объект, который я только что создал, он все равно не сериализуется с форматированием. Может потому, что к тому моменту он уже загружен в память?

Если я использую репозиторий для получения другого курса из базы данных, применяется форматирование сериализации.

Я ожидал, что форматирование будет применено, когда я верну объект Course, независимо от того, был он только что создан или нет. Любые идеи?

Класс курса

/**
 * @ORM\Entity(repositoryClass = "App\Repository\CourseRepository")
 *
 * @HasLifecycleCallbacks
 */
class Course
{
    /**
     * @var string
     *
     * @ORM\Column(type = "date")
     *
     * @Assert\Date
     * @Assert\NotNull
     *
     * @JMS\Type("DateTime<'Y-m-d'>")
     * @JMS\Groups({"courses-list", "course-details"})
     */
    private $startDate;

    /**
     * @return string
     */
     public function getStartDate(): string
     {
         return $this->startDate;
     }
}

Класс контроллера API курса

public function getCourse($id)
{
    $em = $this->getDoctrine()->getManager();
    $repo = $em->getRepository('App:Course');
    $course = $repo->find($id);

    if (!$course) {
        throw new NotFoundHttpException('Course not found', null, 2001);
    }

    return $course;
}

public function addCourse(Request $request) {
    $course = new Course();
    $course->setStartDate($startDate);
    $validator = $this->get('validator');

    $em->persist($course);
    $em->flush();

    return $course;
}

С сериализатором JMS вы не можете просто вернуть элемент, который будет преобразован в правильный выходной формат. Это означает, что где-то в вашем коде есть слушатель на kernel.view, который использует сериализатор JMS. Проблема, вероятно, в этом слушателе, а не внутри JMS. Возможно, в каждом из ваших методов используются разные сериализаторы. В любом случае с кодом, который вы даете, невозможно понять, что здесь не так, но это не похоже на сериализатор JMS.

Nek 23.05.2018 11:21

И POST, и GET используют слушателей, которые должны быть настроены при установке пакетов. Ни один из них не был изменен.

RonnyKnoxville 23.05.2018 11:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
487
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказывается, вам не следует использовать объекты Carbon с JMS Serializer.

Как только я установил объекты DateTime в объекте Course вместо объектов Carbon, все заработало.

Странное поведение, учитывая, что они оба реализуют DateTimeInterface.

Другие вопросы по теме