我需要更改表单中某些字段的验证。验证器是通过一个非常大的yml文件配置的。我想知道是否有任何方法可以同时对两个字段进行验证。 在我的情况下,我有两个不能为空的字段。至少有一个必须填补。
不幸的是,直到现在我才能看到验证是基于每个字段定义的,而不是在多个字段上定义的。
问题是:在标准yml配置中是否可以执行上述验证?
谢谢!
答案 0 :(得分:4)
我建议您查看Custom validator,尤其是Class Constraint Validator。
我不会复制粘贴整个代码,只是你需要更改的部分。
扩展Constraint
类。
的src / Acme公司/ DemoBundle /验证/约束/ CheckTwoFields.php
<?php
namespace Acme\DemoBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*/
class CheckTwoFields extends Constraint
{
public $message = 'You must fill the foo or bar field.';
public function validatedBy()
{
return 'CheckTwoFieldsValidator';
}
public function getTargets()
{
return self::CLASS_CONSTRAINT;
}
}
通过扩展ConstraintValidator
类来定义验证器,foo
和bar
是您要检查的2个字段:
的src / Acme公司/ DemoBundle /验证/约束/ CheckTwoFieldsValidator.php
namespace Acme\DemoBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
class CheckTwoFieldsValidator extends ConstraintValidator
{
public function validate($protocol, Constraint $constraint)
{
if ((empty($protocol->getFoo())) && (empty($protocol->getBar()))) {
$this->context->addViolationAt('foo', $constraint->message, array(), null);
}
}
}
使用验证器:
的src / Acme公司/ DemoBundle /资源/配置/ validation.yml
Acme\DemoBundle\Entity\AcmeEntity:
constraints:
- Acme\DemoBundle\Validator\Constraints\CheckTwoFields: ~