如何验证数组的元素是否是数组本身?

时间:2015-06-24 05:22:29

标签: php symfony symfony-validator

鉴于此输入:

background-size: 100% auto;

如何验证以确保:

  1. [ 'key' => 'value', ] 属性存在
  2. 它的值是一个数组(包含任意数量的元素)
  3. 我希望这个约束能够起作用

    key

    但它引发了一个例外:

        $constraint = new Collection([
            'key' => new Required([
                new Type('array'),
                new Collection([
                    'value' => new Required([
                        new NotBlank(),
                    ]),
                ]),
            ]),
        ]);
    

    我错过了什么?

    PS:它的symfony v2.7.1

    PPS:只是为了澄清:我知道可以使用回调。如果我想从头开始手动重新实现验证 - 我不会在最初使用symfony。所以问题特别是关于组合现有约束而不是关于使用回调约束。

3 个答案:

答案 0 :(得分:4)

两天前我遇到了完全相同的问题

最后的结论是Symfony2验证没有"快速失败"验证。也就是说,即使您的Type()约束失败,它也会继续使用其他约束,因此会因UnexpectedTypeException异常而失败。

然而,我能够找到解决这个问题的方法:

$constraint = new Collection([
    'key' => new Required([
        new Type(['type' => 'array']),
        new Collection([
            // Need to wrap fields into this
            // in order to provide "groups"
            'fields' => [ 
                'value' => new Required([
                    new NotBlank(),
                ]),
            ],
            'groups' => 'phase2' // <-- THIS IS CRITICAL
        ]),
    ]),
]);

// In your controller, service, etc...
$V = $this->get('validator');

// Checks everything by `Collection` marked with special group
$violations = $V->validate($data, $constraint);

if ( $violations->count()){
    // Do something
}

// Checks *only* "phase2" group constraints
$violations = $V->validate($data, $constraint, 'phase2');

if ( $violations->count()){
    // Do something
}

希望这有点帮助。就个人而言,我觉得很烦人,我们需要这样做。某种&#34;快速失败&#34; validator服务中的标志会非常有用。

答案 1 :(得分:2)

您说Collection约束应该失败而不是抛出异常,因为'value'string而不是array

最近记录的Symfony错误:https://github.com/symfony/symfony/issues/14943

答案 2 :(得分:1)

使用Callback约束(docs),您可以在其中实现自定义验证逻辑。

另一种方法是创建自定义约束和验证器类。 (docs