我正在学习Symfony,我为一个新客户启动了一个Symfony项目(2.8.8与php 5.6)。我有一个包含这些字段的实体(php DateTime对象):
/**
* @var date
* @ORM\Column(name="startDate", type="date")
* @Assert\NotNull()
* @Assert\Date()
*/
private $startDate;
/**
* @var date
* @ORM\Column(name="endDate", type="date")
* @Assert\NotNull()
* @Assert\Date()
*/
private $endDate ;
我想验证开始日期早于结束日期。所以我在我的实体中写了一个验证器:
/**
* @Assert\IsTrue(message="Start date must be earlier than end date".)
*/
public function isStartDate()
{
return $this->startDate < $this->endDate ;
}
在我的控制器中,我以这种方式检查我的表单:
$myEntity = new MyEntity();
$form = $this->createForm(MyEntityType::class, $myEntity );
try {
// Is form valid ?
if ($form->handleRequest($request)->isValid()) {
// Do things if form is Valid
}
}
但是结果总是假的,即使startDate早于endDate ...我知道我可以在我的控制器中检查日期,但我想用Symfony验证器来做。我该怎么办?
答案 0 :(得分:2)
您可以使用Symfony自定义回调来解决此问题。有关详细信息,请查看document。
对于给出的方案,您应该有一个验证回调,如下所示:
/**
* @Assert\Callback
*/
public function validate(ExecutionContextInterface $context, $payload) {
if ($this->startDate < $this->endDate) {
$context->buildViolation('Start date must be earlier than end date')
->atPath('startDate')
->addViolation();
}
}
注意:
startDate
)。 ExecutionContextInterface
希望这有帮助!