Symfony验证器和日期比较

时间:2016-08-03 09:40:59

标签: php symfony symfony-forms

我正在学习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验证器来做。我该怎么办?

1 个答案:

答案 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
  • 的正确路径

希望这有帮助!