我有一个具有日期类型和复选框类型的表单,当选中复选框时,日期类型只是必填字段。
因此该复选框称为 overrideDates,日期字段为 overrideDate
所以我创建了一个这样的约束:
<?php
namespace App\Validator\Constraints\Instruction;
use App\Validator\Validators\Instruction\MainInstructionValidator;
use Symfony\Component\Validator\Constraint;
/**
* Class MainInstructionConstraint
* @package App\Validator\Constraints\Instruction
* @Annotation
*/
class MainInstructionConstraint extends Constraint{
/**
* @var string
*/
public $overrideDatesError = "You Must Enter An Override Date";
/**
* @return string
*/
public function getTargets() : string{
return self::CLASS_CONSTRAINT;
}
/**
* @return string
*/
public function validatedBy() : string{
return MainInstructionValidator::class;
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个像这样的验证器:
<?php
namespace App\Validator\Validators\Instruction;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
/**
* Class MainInstructionValidator
* @package App\Validator\Validators\Instruction
*/
class MainInstructionValidator extends ConstraintValidator{
/**
* @param mixed $instruction
* @param Constraint $constraint
*/
public function validate($instruction, Constraint $constraint){
if($instruction->isOverridingDates()){
// make sure the override date is set
if(!is_null($instruction->getOverrideDate()) || !is_a($instruction->getOverrideDate(),'DateTime')){
$this->context->buildViolation($constraint->overrideDatesError)
->atPath('overrideDate')->addViolation();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
验证工作得很好,并且错误消息来自约束,但由于某种原因,它没有显示在以下表单上:
form_errors(form.overrideDate)
Run Code Online (Sandbox Code Playgroud)
我的印象是 atPath() 的用途,因此我可以告诉它在哪个表单字段上显示错误,因为我将整个实体传递给验证器。
现在有点旧了,但这对我有用。
改变
atPath('overrideDate')
Run Code Online (Sandbox Code Playgroud)
到
atPath('[overrideDate]')
Run Code Online (Sandbox Code Playgroud)
克雷格
| 归档时间: |
|
| 查看次数: |
2102 次 |
| 最近记录: |