依赖于另一个字段的条件字段验证

时间:2013-12-09 13:28:06

标签: forms validation symfony

我需要更改表单中某些字段的验证。验证器是通过一个非常大的yml文件配置的。我想知道是否有任何方法可以同时对两个字段进行验证。 在我的情况下,我有两个不能为空的字段。至少有一个必须填补。

不幸的是,直到现在我才能看到验证是基于每个字段定义的,而不是在多个字段上定义的。

问题是:在标准yml配置中是否可以执行上述验证?

谢谢!

1 个答案:

答案 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类来定义验证器,foobar是您要检查的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: ~