Symfony 无法从序列化数据创建DateTime的实例
我对日期有问题。 也许我不了解序列化过程中的某些内容,但是,例如,当我向Api平台(Symfony)发送日期时间时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
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())]);