尽管有NotBlank约束,Symfony DateType无法处理空值

时间:2019-07-11 09:39:19

标签: symfony date constraints symfony4 symfony-forms

我正在制作一个带有birthdate字段的表单,该字段必须填写:

    ->add('birthdate', DateType::class, [
        'widget' => 'single_text',
        'constraints' => [
            new NotBlank(['message' => 'The birthdate is missing']),
            new LessThanOrEqual([
                'value' => (new \DateTime('now'))->modify('-15 years'),
                'message' => 'Must be 15 or older.',
            ])
        ]
    ])

该表单已映射到Preregistration属性不能为空的birthdate 实体

    /**
     * @ORM\Column(type="date")
     */
    private $birthdate;

我正在通过在空白表单中添加novalidate HTML属性来查看表单及其约束,以查看后端验证的行为。尽管受到NotBlank的限制,但我仍然收到此错误:

  

InvalidArgumentException:
  在属性路径“ birthdate”给出的“ DateTimeInterface”类型的期望参数“ NULL”。


当我从widget字段选项中删除birthdate键时,异常消失了(但是我需要/想要使用此小部件)。

什么会导致约束被“绕过”

2 个答案:

答案 0 :(得分:0)

我将通过删除表单类型中的约束并将其添加到实体中来尝试以下操作。

这是一个示例,说明我如何使用没有验证标签的表单

表单类型:

->add(
            'birthdate',
            DateTimeType::class,
            [
                'label' => 'birthdate',
                'widget' => 'single_text',
                'format' => 'dd.MM.yyyy',
            ]

实体:

   /**
     * @var DateTime $birthdate
     *
     * @ORM\Column(type="datetime")
     * @Assert\NotNull()
     */
    private $birthdate;

设置者和获取者:

/**
 * Get birthdate
 *
 * @return DateTime
 */
public function getBirthdate(): ?DateTime
{
    return $this->birthdate;
}

/**
 * Set birthdate
 *
 * @param DateTime $birthdate
 *
 * @return $this
 */
public function setBirthdate($birthdate): self
{
    $this->birthdate = $birthdate;

    return $this;
}

答案 1 :(得分:0)

在您的实体设置器上,将其设置为空

public function setBirthdate(?\DateTimeInterface $birthdate): self
{
    $this->birthdate = $birthdate;

    return $this;
}

然后使用assert对其进行验证

    /**
     * @var DateTime $birthdate
     *
     * @ORM\Column(type="datetime")
     * @Assert\NotNull()
     */
    private $birthdate;