Сущность symfony createAt и тип updateAt - это дата и время, когда я написал API, результат плохой

Прошу прощения за неинформативный заголовок, но вопрос, который я задаю, слишком широк, чтобы уместиться в 10 словах. когда я использую объект symfony createAt и тип updateAt - datetime, когда я написал API, результат плохой. Я не хочу менять createAt и updateAt на строковый тип. Спасибо Защита сущности выглядит следующим образом:

/**
     * @var \DateTime
     *
     * @ORM\Column(name = "updateAt", type = "datetime", options = {"comment":"更新时间"})
     */
    private $updateAt;

метод в репозитории:

public function getList($userId, $isMime)
    {
        $qb = $this->createQueryBuilder('c')
            ->select('c.title,c.nodeName as node_name, c.node, c.updateAt as datetime');
        if ($isMime == 0){
            $qb->leftJoin(ApprovalInformation::class,'a','WITH','a.flowId = 11 and a.itemId = c.id');
            $qb->where('a.approverId = :uid');
        }else{
            $qb->where('c.userId = :uid');
        }
        $qb->setParameter('uid', $userId);
        return $qb->getQuery()->getResult();
    }

контроллер

$list = $cardRepo->getList($this->user->getId(), $mime);
        return $this->json([
            'code' => 1,
            'msg' => '获取成功',
            'data' => $list
        ]);
{
    "code": 1,
    "msg": "获取成功",
    "data": [
        {
            "title": "测试报告",
            "node_name": "处长批示",
            "node": 11,
            "datetime": {
                "date": "2019-05-07 19:04:00.000000",
                "timezone_type": 3,
                "timezone": "Asia/Shanghai"
            }
        },
        {
            "title": "测试报告2222",
            "node_name": "处长审批",
            "node": 2,
            "datetime": {
                "date": "2019-05-07 19:28:14.000000",
                "timezone_type": 3,
                "timezone": "Asia/Shanghai"
            }
        }
    ]
}
my except result like is:

{
    "code": 1,
    "msg": "获取成功",
    "data": [
        {
            "title": "测试报告",
            "node_name": "处长批示",
            "node": 11,
            "datetime": "2019-05-07 19:04:00",
        },
        {
            "title": "测试报告2222",
            "node_name": "处长审批",
            "node": 2,
            "datetime": "2019-05-07 19:28:14",
        }
    ]
}

Я хочу знать эффективное решение. Спасибо

реализовать php.net/jsonserializable для вашей карты. там не позволяйте дате и времени кодировать себя, а вместо этого вызывайте $updateAt->format(...)

Jakumi 07.05.2019 16:25

как выглядит ваша функция $this->json()? вам нужно убедиться, что ваш DateTime сериализован так, как вы хотите его раскрыть.

LBA 07.05.2019 16:26
$this->json() — это вспомогательная функция, генерирующая ControllerTrait symfony по умолчанию, JsonResponse-генерирующая вспомогательная функция, которая, по сути, просто вызывает json_encode и дословно помещает ее в объект ответа (устанавливая заголовки типа контента и прочее)
Jakumi 07.05.2019 16:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
3
93
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы используете $this->json() в своем контроллере, который сериализует вашу сущность с помощью json_encode(). Это то, что заставляет дату и время возвращаться следующим образом:

$ php -a

php > echo json_encode(new DateTime());
{"date":"2019-05-07 14:20:22.137677","timezone_type":3,"timezone":"UTC"}

Есть несколько способов обойти это. Вы можете создать массив из своих данных перед вызовом $this->json():

return $this->json(
    array_map(
        function ($entity) {
            return [
                'title' => $entity->getTitle(),
                ...
                'updateAt' => $entity->getUpdateAt()->format('Y-m-d H:i:s'),
            ];
        },
        $list
    )
);

В качестве альтернативы вы можете использовать сериализатор Symfony: https://symfony.com/doc/current/components/serializer.html#serializing-an-object

Если вы используете Serializer, убедитесь, что у вас также зарегистрирован DateTimeNormalizer.

Просто сделайте это следующим кодом в вашей функции getUpdateAt в объекте:

return $this->updateAt->format('Y-m-d  h:I:s);

это не совсем то, что вызывает проблему, поскольку getUpdateAt — это нет, вызываемый json_encode (который использует $this->json). но в качестве побочного эффекта вы возвращаете неожиданное значение из getUpdateAt (я бы ожидал дату и время, когда он определен как дата и время)

Jakumi 09.05.2019 02:27

@Techie Adict спасибо, я тестирую, но это не строка

lcp0578 09.05.2019 02:44

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