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

Php 如何验证数组的元素是否为数组本身?,php,symfony,symfony-validator,Php,Symfony,Symfony Validator,鉴于这一投入: [ 'key' => 'value', ] 如何验证以确保: 键属性存在 它的值是一个数组(包含任意数量的元素) 我原以为这种约束会起作用 $constraint = new Collection([ 'key' => new Required([ new Type('array'), new Collection([ 'value' => new

鉴于这一投入:

[
    'key' => 'value',
]
如何验证以确保:

  • 属性存在
  • 它的值是一个数组(包含任意数量的元素)
  • 我原以为这种约束会起作用

        $constraint = new Collection([
            'key' => new Required([
                new Type('array'),
                new Collection([
                    'value' => new Required([
                        new NotBlank(),
                    ]),
                ]),
            ]),
        ]);
    
    但它抛出了一个例外:

    Symfony\Component\Validator\Exception\UnexpectedTypeException: Expected argument  of type "array or Traversable and ArrayAccess", "string" given
    
    我错过了什么

    附言:这是symfonyv2.7.1


    PPS:只是澄清一下:我知道一个人可以使用回调。如果我想从头开始手动重新实现验证,我一开始就不会使用symfony。因此,问题特别是如何组合现有约束,而不是如何使用回调约束。

    使用
    回调
    约束(),在这里可以实现自定义验证逻辑


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

    您是说
    集合
    约束应该失败,而不是抛出异常,因为
    的“值”
    字符串
    而不是
    数组


    最近有一个记录的Symfony错误:

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

    最后的结论是,
    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
    }
    
    $constraint=新集合([
    “键”=>需要新的([
    新类型(['Type'=>'array']),
    新收藏([
    //需要将字段包装到这个
    //为了提供“团体”
    “字段”=>[
    “值”=>需要新的([
    新的NotBlank(),
    ]),
    ],
    'groups'=>'phase2'//get('validator');
    //按标有特殊组的“集合”检查所有内容
    $violations=$V->validate($data,$constraint);
    如果($违规->计数()){
    //做点什么
    }
    //检查*仅*“阶段2”组约束
    $violations=$V->validate($data,$constraint,'phase2');
    如果($违规->计数()){
    //做点什么
    }
    

    希望这能有所帮助。就个人而言,我觉得我们需要这样做很烦人。在
    validator
    服务中使用某种“fast fail”标志会很有帮助。

    类似于
    if((is_数组($a))或($a可遍历的实例))
    @Umair问题特别是关于使用symfony2验证器的问题。您的建议是什么?要重新实现所有symfony2约束?使用symfony验证器有什么意义?约束有一个所谓的“默认选项”的概念,这是
    类型
    约束的情况下的
    类型
    。这意味着
    新类型(['type'=>'array'])
    新类型('array')
    相同。查看和执行类型验证总是“有趣的”,因为实际发生的类型错误在什么级别上都不清楚。很抱歉,请尝试这个新答案。“您的输入将字符串'value'作为索引'key'的值,而索引'key'不是数组,因此在此处引发异常”-我知道引发异常的原因。问题是:如何编写接受任何输入的约束。如果我能保证输入始终有效,我将不使用验证器。“如果您将输入更改为“---你能把它放在你的网站上吗:亲爱的黑客们,请不要把我们不知道的东西传给我们,因为它使我们的应用程序崩溃了?这看起来终于是一个答案了,谢谢:-)赏金还有3天就要到期了,这是唯一的候选人。