4

如果有某种标志/选项强制 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:第一个错误时验证停止

如何在 Symfony2 中停止对约束失败的验证

Symfony-2 给出了不止一个验证错误信息

最后一个非常好,但是当有多个验证器时,有什么方法可以在不使用验证组的情况下做到这一点?我在某处读到 Symfony 2.2 中会有一个标志或选项,但我有 2.2.1 版本,找不到这样的选项。

4

2 回答 2

3

您可以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_factorysymfony 服务来解决在当前实现中处理嵌套约束的问题:https ://github.com/symfony/Validator/blob/fc0650c1825c842f9dcc4819a2eaff9922a07e7c/ConstraintValidatorFactory.php#L48 。

查看NoCacheConstraintValidatorFactory.phpgist 中的文件以了解如何解决它。

于 2014-03-07T11:14:29.973 回答
0

从 Symfony 2.3 开始,您可以使用组序列来做到这一点(尽管对组序列的表单支持可能参差不齐)。

于 2014-02-12T04:28:44.270 回答