class MyEntity
{
private $fieldA;
private $fieldB;
/**
* @Assert\Expression(
* expression="this.fieldA != '' || this.fieldB != '' || value != ''",
* message="Either field A or field B or field C must be set"
* )
*/
private $fieldC;
}
您也可以将验证方法加入至类别,并使用Callback条件约束注解它:
/**
* @Assert\Callback
*/
public function validateFields(ExecutionContextInterface $context)
{
if ('' === $this->fieldA && '' === $this->fieldB && '' === $this->fieldC) {
$context->addViolation('At least one of the fields must be filled');
}
}
public function getTargets()
{
return self::CLASS_CONSTRAINT;
}
您的validate:
public function validate($entity, Constraint $constraint)
{
// Do whatever validation you need
// You can specify an error message inside your Constraint
if (/* $entity->getFieldA(), ->getFieldB(), ->getFieldC() ... */) {
$this->context->addViolationAt(
'foo',
$constraint->message,
array(),
null
);
}
}
4条答案
按热度按时间gudnpqoy1#
还有比编写自定义验证器更简单的解决方案,其中最简单的可能是表达式约束:
您也可以将验证方法加入至类别,并使用Callback条件约束注解它:
方法将在类别验证期间执行。
ivqmmu1c2#
这可能是一个Custom Validation Constraint的用例,我自己还没有用过,但基本上你创建了一个
Constraint
和一个Validator
,然后在你的config/validation.yml
中指定你的Constraint
。实际的验证是由
Validator
完成的。您可以让Symfony将整个实体传递给validate
方法,以便使用以下方法访问多个字段:您的
validate
:bwitn5fc3#
可以使用组序列提供程序执行此操作,例如:
没有测试,但我认为它会工作
tquggr8v4#
我知道这是一个老问题,但您也可以使用此包https://github.com/secit-pl/validation-bundle中的NotBlankIf验证器