提问者:小点点

Symfony验证器和日期比较


我正在学习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个答案

匿名用户

您可以使用Symfony自定义回调解决此问题。详情请查看文档。

对于给定的场景,您应该有一个验证回调,如下所示:

/**
 * @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();
    }
}

注:

  • 请参阅,错误设置为字段路径(start Date)。
  • 代码未经测试!.
  • ExecutionContextInterface
  • 使用正确的路径

希望这有帮助!