Symfony 验证器和日期比较
Symfony validator and dates comparison
我正在学习 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 验证器来做。我该怎么办?
您可以使用 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
使用正确的路径
希望对您有所帮助!
我正在学习 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 验证器来做。我该怎么办?
您可以使用 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
使用正确的路径
希望对您有所帮助!