为啥我在 Symfony 5 上使用 DateTime 约束时会收到“此值应该是字符串类型”?
Posted
技术标签:
【中文标题】为啥我在 Symfony 5 上使用 DateTime 约束时会收到“此值应该是字符串类型”?【英文标题】:Why do I receive "This value should be of type string" when using a DateTime constraint on Symfony 5?为什么我在 Symfony 5 上使用 DateTime 约束时会收到“此值应该是字符串类型”? 【发布时间】:2020-05-30 07:59:31 【问题描述】:我有以下实体(仅附上相关部分):
use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ApiResource(mercure=true)
* @ORM\Entity(repositoryClass="App\Repository\EventRepository")
*/
class Event
/**
* @ORM\Column(type="datetime")
* @Assert\DateTime
* @Assert\NotNull
*/
private $createdAt;
public function __construct()
$this->createdAt = new \DateTime();
public function getCreatedAt(): ?\DateTimeInterface
return $this->createdAt;
public function setCreatedAt(\DateTimeInterface $createdAt): self
$this->createdAt = $createdAt;
return $this;
它的存储库:
class EventRepository extends ServiceEntityRepository
public function __construct(ManagerRegistry $registry)
parent::__construct($registry, Event::class);
向事件端点(通过 Postman 或 Swagger UI)创建 POST 请求时,它会失败并出现以下异常:
【问题讨论】:
@delboy1978uk 我用的是Api Platform,它会自动插入。 "name": "test", "@creator": "/people/23", "description": "desc"
虽然这无关紧要,因为错误在构造函数中初始化的createdAt
属性中
我相信line throwing the error is here。我想知道您是否要删除 ApiPlatform 并自己创建一个Event
并手动验证它,如果您遇到问题(它至少会消除复杂性)。也许是 ApiPlatform 加载对象的方式?
嗯,我有另一个实体(未连接到 API 平台)包含具有相同约束的 DateTime 并且按预期工作。
我们使用的是 AP 2.1,我记得它可能是如何生成对象的(已经有一段时间了)?您可以进入 vendor 中的验证器文件和dump()
它要检查的内容,这就是我要开始的地方。
【参考方案1】:
你使用了错误的断言。
Date
expects a string or an object that can be cast into a string。 DateTimeInterface
两者都不是。
您应该使用Type
constraint。
/**
* @Assert\Type("\DateTimeInterface")
*/
private $createdAt;
使用 Assert\Date
验证 DateTime
对象的功能在 Symfony 4.2 和 on Symfony 5.0 it was removed altogether 上已被弃用。
【讨论】:
啊!我们在某些地方有@Assert\Type("datetime")
,所以这是有道理的。
这对我来说是全新的!我一直在使用@Assert\DateTime(groups="new")
,现在在我的新 symfony 5.1 项目中收到了那个奇怪的验证器消息。现在我更改为上面给出的示例并且它可以工作。惊人的!谢谢
如果你需要自定义断言,这里有一个例子:@Assert\Type(type="\DateTimeInterface", message="Custom Message")以上是关于为啥我在 Symfony 5 上使用 DateTime 约束时会收到“此值应该是字符串类型”?的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Encore 在 Symfony 5.3 上正确安装和使用引导程序
Symfony 5 异常上的 FosRestBundle 不起作用