【问题标题】:Stop validation on first error flag in Symfony2?停止验证 Symfony2 中的第一个错误标志?
【发布时间】:2013-05-03 13:21:13
【问题描述】:

如果有某种标志/选项强制 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 版本,找不到这样的选项。

【问题讨论】:

    标签: validation symfony-2.2


    【解决方案1】:

    您可以为此目的使用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

    请参阅 gist 中的 NoCacheConstraintValidatorFactory.php 文件,了解如何解决它。

    【讨论】:

      【解决方案2】:

      从 Symfony 2.3 开始,您可以使用 Group Sequences 执行此操作(尽管对组序列的表单支持可能参差不齐)。

      【讨论】:

      • 因此,如果我想在每个错误后停止验证,我应该创建与单个表单字段上的最大验证器数量一样多的组序列?例如,我有两个文件,第一个有 2 个验证器,第二个有 5 个。所以要停止每个错误,我必须创建五个组序列?
      • 据我了解,是的。虽然如果我是你,我会检查表单的组序列验证支持。我确定 2.2.1 版不支持它们。
      猜你喜欢
      • 2012-11-14
      • 1970-01-01
      • 2016-07-12
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      • 2022-10-18
      • 2019-03-11
      • 1970-01-01
      相关资源
      最近更新 更多