为什么在 Symfony 5 上使用 DateTime 约束时收到“此值应为字符串类型”?

我有以下实体(仅附加相关部分):

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);
    }
}

创建对事件终结点的 POST 请求(通过 Postman 或 Swagger UI)时,它将失败,并出现以下异常:

profiler


答案 1

你正在使用错误的断言。

Date 需要可以转换为字符串的字符串或对象。而 a 也不是。DateTimeInterface

您应该使用约束Type

/**
 * @Assert\Type("\DateTimeInterface")
 */
 private $createdAt;

用于验证对象的功能在 Symfony 4.2 上被弃用,在 Symfony 5.0 上被完全删除Assert\DateDateTime


答案 2

推荐