我想将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中的当前日期进行了比较。
想法?
答案 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;
}
答案 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'])
]
]
);