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天就要到期了,这是唯一的候选人。