依赖于其他字段的条件字段验证

3
我需要更改表单中某些字段的验证。验证器是通过一个相当大的yml文件进行配置的。我想知道是否有办法同时对两个字段进行验证。在我的情况下,有两个字段不能都为空。至少要填写一个。
不幸的是,到目前为止,我只能看到验证是基于每个字段而不是多个字段一起定义的。
问题是:在标准的yml配置中是否可能执行上述验证?
谢谢!
1个回答

4
我建议您查看自定义验证器,特别是类约束验证器
我不会复制整个代码,只会更改您需要更改的部分。
扩展Constraint类。 src/Acme/DemoBundle/Validator/Constraints/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是您想要检查的两个字段:

src/Acme/DemoBundle/Validator/Constraints/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/Resources/config/validation.yml


(注:该段内容为原文,无需翻译)
Acme\DemoBundle\Entity\AcmeEntity:
    constraints:
        - Acme\DemoBundle\Validator\Constraints\CheckTwoFields: ~

感谢您接受答案。我没有测试过我的代码,很高兴它对您有用! - A.L
使用 sfValidator 类是否可能实现类似这样的解决方案? - fstab
1
抱歉,我只熟悉Symfony2,不熟悉Symfony1。 - A.L
在公共函数 validatedBy() 中,请记得指定所有的类路径,例如 Acme\DemoBundle\Validator\Constraints\CheckTwoFieldsValidator - Massimo212121
@Massimo212121,我按照官方文档的步骤进行操作,但仅返回类名。 - A.L
@A.L 我也遵循了这个方法,但是使用WebTestCase时找不到类,我的建议是在所有情况下都指定类名 :) - Massimo212121

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接