Symfony Assert \ Expression比较实体属性与今天的日期

时间:2017-11-21 14:13:02

标签: symfony expression entity assert

我想将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;

我尝试使用现在 datetime.now()进行同样的操作,并且我已经在很多地方进行谷歌搜索,但我还没有发现任何地方实际上有人将另一个值与Assert Expression中的当前日期进行了比较。

想法?

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

默认情况下,表达式语法仅支持一个函数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;
}

文档链接:Expression ConstraintExpression Syntax

答案 2 :(得分: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'])
                ]
            ]
        );