Symfony Assert\Expression如何将实体属性与今天的日期进行比较?

3

我想在实体的属性中添加一个Assert\Expression。当所选的“生效日期”(this.getEffective())是过去或今天时,应该弹出错误消息。我只是无法弄清楚如何将该日期与今天的日期进行比较。

    /**
 * @var boolean
 * @ORM\Column(type="boolean", nullable=true)
 * @Assert\Expression(
 *     "this.getEffective() > today",
 *     message="The effective date must be in the future!")
 */
private $status_stealth;

我尝试了使用nowdatetime.now()进行相同的操作,并且我已经在Google上搜索了很多,但我没有找到有人实际比较另一个值与当前日期的断言表达式。

你有什么想法吗?

3个回答

2

默认情况下,表达式语法仅支持一个函数constant()。反过来,表达式验证器带有一个或两个变量(验证值和上下文对象)。您可以向实体的验证方法传递一个值。

/**
 * @Assert\Expression(expression="this.isStatusValid(value)")
 */
private $status;

public function isStatusValid($status) {
    $currentDate = new \DateTimeImmutable();
    return in_array($status, [1, 2, 3]) && $this->targetDate > $currentDate;
}

如果遇到错误,只需进行调试。

public function isStatusValid($status) {
    $currentDate = new \DateTimeImmutable();
    var_dump($this->targetDate);
    var_dump($currentDate);
    die();
    return in_array($status, [1, 2, 3]) && $this->targetDate > $currentDate;
}

文档链接:表达式约束表达式语法


1
你可以在实体中定义一个新方法,该方法将返回今天的日期时间,并在表达式中进行比较。
/**
 * @var boolean
 * @ORM\Column(type="boolean", nullable=true)
 * @Assert\Expression(
 *     "this.getEffective() > this.getCurrentDate()",
 *     message="The effective date must be in the future!")
 */
private $status_stealth;

public function getCurrentDate(){
    return new \DateTime();
}

使用 DateTimeImmutable 更好。 - Oleg Belostotsky
@M Khalid Junaid,我也可以检查一下status_stealth是否被检查了吗?所以说:“this.getStatusStealth() == true and this.getEffective() > this.getCurrentDate()”它还没有起作用,但我不知道为什么。 - sonja
@sonja 你需要检查表达式语法 表达式语言/语法,也许这样会起作用 this.getStatusStealth() && this.getEffective() > this.getCurrentDate() - M Khalid Junaid
@sonja 我的意思是使用 DateTimeImmutable 而不是 DateTime。在这种情况下,它更加正确。另外我添加了答案,请阅读。 - Oleg Belostotsky
@MKhalidJunaid 很不幸,它还是不能工作... :/ 尽管检查了语法,但仍然不知道为什么。 - sonja
@sonja,你可以将所有的比较操作放在一个单独的函数中,并返回 true 或 false,在表达式中调用该函数,这样如果它返回 false,则会出现验证错误。 - M Khalid Junaid

0

如果你想的话,你可以使用Symfony的表达式:

  $builder->add(
            'start',
            DateTimeType::class,
            [
                'label' => 'Campaign Starts At',
                'data' => $entity->getStart(),
                'required' => true,
                'disabled' => $disabled,
                'widget'  => 'single_text',
                'constraints' => [
                    new Assert\GreaterThan(['value' => 'today'])
                ]
            ]
        );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接