2
我需要更改窗体中某些字段的验证。验证器通过非常大的yml文件进行配置。我想知道是否有办法一次对两个字段进行验证。 在我的情况下,我有两个字段不能同时为空。至少有一个必须填写。依赖于另一个字段的条件字段验证
不幸的是,直到现在我才能看到验证是基于每个字段定义的,而不是在多个字段上。
问题是:是否有可能在标准的yml配置中执行上述验证?
谢谢!
我需要更改窗体中某些字段的验证。验证器通过非常大的yml文件进行配置。我想知道是否有办法一次对两个字段进行验证。 在我的情况下,我有两个字段不能同时为空。至少有一个必须填写。依赖于另一个字段的条件字段验证
不幸的是,直到现在我才能看到验证是基于每个字段定义的,而不是在多个字段上。
问题是:是否有可能在标准的yml配置中执行上述验证?
谢谢!
我建议你看看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/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: ~
感谢您接受的答案。我没有测试过我的代码,我很高兴它为你工作! –
是类似于这种可能使用sfValidator类的解决方案吗? – fstab
我只知道Symfony2,而不是Symfony1,对不起。 –