如何验证数组的元素是否是数组本身?
How to validate if an element of an array is an array itself?
鉴于此输入:
[
'key' => 'value',
]
如何验证以确保:
key
属性存在
- 它的值是一个数组(具有任意数量的元素)
我预计此约束会起作用
$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
我错过了什么?
PS: 这是 symfony v2.7.1
PPS:澄清一下:我知道可以使用回调。如果我想从头开始手动重新实现验证——我一开始就不会使用 symfony。所以问题特别是关于 组合 现有约束,而不是关于使用回调约束..
使用 Callback
约束 (docs),您可以在其中实现自定义验证逻辑。
另一种方法是创建自定义约束和验证器类。 (docs)
您是说 Collection
约束应该直接失败而不是抛出异常,因为 'value'
是 string
而不是 array
。
有一个最近记录的 Symfony 错误:https://github.com/symfony/symfony/issues/14943
两天前我遇到了完全相同的问题。
最后的结论是Symfony2
验证没有"fast-fail"验证。也就是说,即使您的 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
}
希望这对您有所帮助。就我个人而言,我觉得我们需要这样做很烦人。 validator
服务中的某种 "fast-fail" 标志会很有帮助。
鉴于此输入:
[
'key' => 'value',
]
如何验证以确保:
key
属性存在- 它的值是一个数组(具有任意数量的元素)
我预计此约束会起作用
$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
我错过了什么?
PS: 这是 symfony v2.7.1
PPS:澄清一下:我知道可以使用回调。如果我想从头开始手动重新实现验证——我一开始就不会使用 symfony。所以问题特别是关于 组合 现有约束,而不是关于使用回调约束..
使用 Callback
约束 (docs),您可以在其中实现自定义验证逻辑。
另一种方法是创建自定义约束和验证器类。 (docs)
您是说 Collection
约束应该直接失败而不是抛出异常,因为 'value'
是 string
而不是 array
。
有一个最近记录的 Symfony 错误:https://github.com/symfony/symfony/issues/14943
两天前我遇到了完全相同的问题。
最后的结论是Symfony2
验证没有"fast-fail"验证。也就是说,即使您的 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
}
希望这对您有所帮助。就我个人而言,我觉得我们需要这样做很烦人。 validator
服务中的某种 "fast-fail" 标志会很有帮助。