Symfony 无法从序列化数据创建DateTime的实例

Symfony 无法从序列化数据创建DateTime的实例,symfony,datetime,vue.js,api-platform.com,Symfony,Datetime,Vue.js,Api Platform.com,我对日期有问题。 也许我不了解序列化过程中的某些内容,但是,例如,当我向Api平台(Symfony)发送日期时间时 dateEvaluation:“2017-12-05T11:52:00.000Z” 我得到了这个错误信息 无法从序列化数据创建DateTime实例,因为其构造函数要求参数“time”存在。 这是我的实体 <?php namespace App\Entity; use ApiPlatform\Core\Annotation\ApiResource; use Doctrine

我对日期有问题。 也许我不了解序列化过程中的某些内容,但是,例如,当我向Api平台(Symfony)发送日期时间时

dateEvaluation:“2017-12-05T11:52:00.000Z”

我得到了这个错误信息

无法从序列化数据创建DateTime实例,因为其构造函数要求参数“time”存在。

这是我的实体

<?php

namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;

/**
 * @ORM\Entity(repositoryClass="App\Repository\EvaluationRepository")
 * @ORM\HasLifecycleCallbacks()
 * @ApiResource(attributes={
 *     "normalization_context"={
 *              "groups"={"Evaluation"}
 *              }
 *     })
 */
class Evaluation
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     * @Groups({"NotesEvaluations", "Evaluation"})
     */
    private $id;

    /**
     * @var \DateTime
     * @ORM\Column(type="datetime")
     * @Groups({"Evaluation"})
     */
    private $created;

    /**
     * @var \DateTime
     * @ORM\Column(type="datetime")
     * @Groups({"Evaluation"})
     */
    private $updated;

    /**
     * @var \DateTime
     * @ORM\Column(type="datetime")
     * @Groups({"Evaluation"})
     */
    private $dateEvaluation;

    /**
     * @var string
     *
     * @ORM\Column(type="text")
     * @Groups({"Evaluation"})
     */
    private $commentaire;

    /**
     * @var
     *
     * @ORM\ManyToOne(targetEntity="App\Entity\Personnel")
     * @Groups({"NotesEvaluations", "Evaluation"})
     */
    private $auteur;

    /**
     * @var
     *
     * @ORM\ManyToMany(targetEntity="App\Entity\Personnel")
     */
    private $autorises;

    /**
     * @var integer
     *
     * @ORM\Column(type="integer")
     */
    private $annee;

    /**
     * @var
     *
     * @ORM\ManyToOne(targetEntity="App\Entity\Module", inversedBy="evaluations")
     * @Groups({"Evaluation"})
     */
    private $module;

    /**
     * @var Boolean
     *
     * @ORM\Column(type="boolean")
     * @Groups({"NotesEvaluations"})
     */
    private $visible;

    /**
     * @var Boolean
     *
     * @ORM\Column(type="boolean")
     * @Groups({"NotesEvaluations"})
     */
    private $modifiable;

    /**
     * @var
     *
     * @ORM\ManyToOne(targetEntity="App\Entity\TypeGroupe")
     * @Groups({"Evaluation"})
     */
    private $typegroupe;

    /**
     * @var float
     *
     * @ORM\Column(type="decimal")
     * @Groups({"Evaluation"})
     */
    private $coefficient;

    /**
     * @return float
     */
    public function getCoefficient(): float
    {
        return $this->coefficient;
    }

    /**
     * @return mixed
     */
    public function getTypegroupe()
    {
        return $this->typegroupe;
    }

    /**
     * @param mixed $typegroupe
     */
    public function setTypegroupe($typegroupe): void
    {
        $this->typegroupe = $typegroupe;
    }

    /**
     * @return \DateTime
     */
    public function getDateEvaluation(): \DateTime
    {
        return $this->dateEvaluation;
    }

    /**
     * @param \DateTime $dateEvaluation
     */
    public function setDateEvaluation(\DateTime $dateEvaluation): void
    {
        $this->dateEvaluation = $dateEvaluation;
    }

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

    /**
     * @param string $commentaire
     */
    public function setCommentaire(string $commentaire): void
    {
        $this->commentaire = $commentaire;
    }

    /**
     * @param float $coefficient
     */
    public function setCoefficient(float $coefficient): void
    {
        $this->coefficient = $coefficient;
    }

    /**
     * @return mixed
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return \DateTime
     */
    public function getCreated(): \DateTime
    {
        return $this->created;
    }

    /**
     * @param \DateTime $created
     */
    public function setCreated(\DateTime $created): void
    {
        $this->created = $created;
    }

    /**
     * @return \DateTime
     */
    public function getUpdated(): \DateTime
    {
        return $this->updated;
    }

    /**
     * @param \DateTime $updated
     */
    public function setUpdated(\DateTime $updated): void
    {
        $this->updated = $updated;
    }

    /**
     * @return mixed
     */
    public function getAuteur()
    {
        return $this->auteur;
    }

    /**
     * @param mixed $auteur
     */
    public function setAuteur($auteur): void
    {
        $this->auteur = $auteur;
    }

    /**
     * @return mixed
     */
    public function getAutorises()
    {
        return $this->autorises;
    }

    /**
     * @param mixed $autorises
     */
    public function setAutorises($autorises): void
    {
        $this->autorises = $autorises;
    }

    /**
     * @return int
     */
    public function getAnnee(): int
    {
        return $this->annee;
    }

    /**
     * @param int $annee
     */
    public function setAnnee(int $annee): void
    {
        $this->annee = $annee;
    }

    /**
     * @return mixed
     */
    public function getModule()
    {
        return $this->module;
    }

    /**
     * @param mixed $module
     */
    public function setModule($module): void
    {
        $this->module = $module;
    }

    /**
     * @return bool
     */
    public function isVisible(): bool
    {
        return $this->visible;
    }

    /**
     * @param bool $visible
     */
    public function setVisible(bool $visible): void
    {
        $this->visible = $visible;
    }

    /**
     * @return bool
     */
    public function isModifiable(): bool
    {
        return $this->modifiable;
    }

    /**
     * @param bool $modifiable
     */
    public function setModifiable(bool $modifiable): void
    {
        $this->modifiable = $modifiable;
    }

    /**
     * @ORM\PreUpdate
     */
    public function updateDate(): void
    {
        $this->setUpdated(new \Datetime());
    }

    public function __construct()
    {
        $this->setCreated(new \Datetime());
        $this->setUpdated(new \Datetime());

    }
}
谢谢你的帮助。
David

我找到了一种管理这个错误的方法,这种方法对我很有效。我在我的config.yml中声明
DateTimeNormalizer
,如下所示:

datetime_normalizer:
    class: Symfony\Component\Serializer\Normalizer\DateTimeNormalizer
    public: false
    tags: [serializer.normalizer]

我希望这对你有帮助

在v1.1中,api平台默认等待的是使用类
\DateTimeImmutable
而不是
\DateTime

class Evaluation {
    public function __construct()
    {
        $this->setCreated(new \DateTimeImmutable());
        $this->setUpdated(new \DateTimeImmutable());
    }
}

将实体中的
\DateTime
更改为
\DateTimeInterface
。它应该可以工作。

在我的例子中,我使用的是Symfony的序列化程序组件,没有Symfony项目,在反规范化过程中我遇到了这个问题,因此我必须在规范化器数组上的
对象规范化器之前添加
日期时间规范化器,如下所示:

 $serializer = new Serializer([new DateTimeNormalizer(), new ObjectNormalizer(null, new CamelCaseToSnakeCaseNameConverter())]);

请注意,这里的顺序很重要。

您可以看到,这是因为规范化器不正确。唯一的解决方案是创建您自己的服务,该服务将正确地将对象的属性转换为使用
time
。很遗憾,您使用的是哪个版本的Api平台?从
composer show
命令中检查它,并尝试更新到最近的版本。通常api平台应返回并接受ISO8610格式中的日期谢谢@Vadim。我使用此版本的API平台
API平台/API包v1.0.1 API平台包/core v2.1.4创建web API的最终解决方案。
@DAnnebicque您的问题解决了吗?我面临着同样的问题。@UgoT。不是真的。我与另一个序列化程序发生冲突。但是如果我删除它,我就不能再管理上传了。谢谢!如果您使用tag serializer.normalizer声明一个服务,它将覆盖框架默认规范化器。。关于这件事的医生说得太轻了没有关系
 $serializer = new Serializer([new DateTimeNormalizer(), new ObjectNormalizer(null, new CamelCaseToSnakeCaseNameConverter())]);