为啥我在 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】:

你使用了错误的断言。

Dateexpects 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 约束时会收到“此值应该是字符串类型”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥要安装 symfony 版本 4? [复制]

无法使用 Encore 在 Symfony 5.3 上正确安装和使用引导程序

Symfony 5 异常上的 FosRestBundle 不起作用

为啥在 prod mod 的 symfony 5.3 中出现 503 错误,而在 dev mod 中却没有

Symfony 4 在 Windows 上非常慢

为什么Symfony 5.1无法识别在“ routes.php”文件上配置的路由?