如果有某种标志/选项迫使symfony2验证停止在验证链中的第一个错误上,我正在搜索信息。例如,我的email
字段中有三个验证器:
email:
- NotBlank: { groups: [ send_activation_email ] }
- Length: { min: 6, max: 80, charset: UTF-8, groups: [ send_activation_email ] }
- Email: { groups: [ send_activation_email ] }
我想在第一次出错后停止验证。我怎样才能做到这一点?我读了类似的问题:
Symfony2 : Validation Halt on First Error
How to stop validation on constraint failure in Symfony2
Symfony-2 gives more than one validation error message
最后一个是相当不错的,但是当有多个验证器时,是否有任何方法可以在不使用验证组的情况下执行此操作?我在某处看到,在Symfony 2.2中会有一个标志或选项,但我有2.2.1版本,无法找到这样的选项。
答案 0 :(得分:4)
您可以将Chain
验证程序用于此目的:https://gist.github.com/rybakit/4705749
以下是普通PHP中的一个示例:
<?php
use Symfony\Component\Validator\Constraints\Date;
use Symfony\Component\Validator\Constraints\Type;
use Acme\Validator\Constraints\Chain;
$constraint = new Chain([new Type('string'), new Date()]);
在XML中:
<!-- src/Acme/DemoBundle/Resources/config/validation.xml -->
<class name="Acme\DemoBundle\Entity\AcmeEntity">
<property name="date">
<constraint name="Acme\Validator\Constraints\Chain">
<option name="constraints">
<constraint name="Type">
<option name="type">string</option>
</constraint>
<constraint name="Date" />
</option>
</constraint>
</property>
</class>
但请注意,如果您想要嵌套Chain
约束,例如:
<?php
$constraint = new Chain([
new Callback(...),
new Chain([new Type('string'), new Date()]),
]);
您必须覆盖validator.validator_factory
symfony服务,以解决当前实现中处理嵌套约束的问题:https://github.com/symfony/Validator/blob/fc0650c1825c842f9dcc4819a2eaff9922a07e7c/ConstraintValidatorFactory.php#L48。
请参阅要点中的NoCacheConstraintValidatorFactory.php
文件,了解如何解决该问题。
答案 1 :(得分:1)
从Symfony 2.3开始,您可以使用Group Sequences执行此操作(尽管对组序列的形式支持可能不稳定)。