2013-12-09 184 views
2

我需要更改窗体中某些字段的验证。验证器通过非常大的yml文件进行配置。我想知道是否有办法一次对两个字段进行验证。 在我的情况下,我有两个字段不能同时为空。至少有一个必须填写。依赖于另一个字段的条件字段验证

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

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

谢谢!

回答

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/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 /资源/配置/ validation.yml

Acme\DemoBundle\Entity\AcmeEntity: 
    constraints: 
     - Acme\DemoBundle\Validator\Constraints\CheckTwoFields: ~ 
+0

感谢您接受的答案。我没有测试过我的代码,我很高兴它为你工作! –

+0

是类似于这种可能使用sfValidator类的解决方案吗? – fstab

+1

我只知道Symfony2,而不是Symfony1,对不起。 –

相关问题