有一个班级Item
。它有一个属性type
,可以是a
,b
或c
。对于所有类型,有一组共同的最小属性/输入字段:type
和其他字段。每种类型都有一些其他属性:
default set of the common fields
type
...
additional fields in case of type=a
foo
additional fields in case of type=b
bar
baz
additional fields in case of type=c
bar
baz
buz
此外,bar
和bar
的验证规则与type=b
和type=c
的情况略有不同。
如何根据字段(或多个字段)的值在ZF2 / Apigilty应用程序中设置验证?对于这个具体情况:如何根据{设置验证{1}}?
更新
属性type
是依赖于的。这意味着 - 如果其他字段(type
,foo
等)与其不匹配,则不应该变为无效。 (它是bar
并获得允许值的validated agains an array,就是这样。)
所以,它应该在相反的方向工作:
required
答案 0 :(得分:0)
您可以使用自定义逻辑编写ValidTypeInputFilter
并附加一个类似于此的配置:
array(
'type' => array(
'name' => 'type',
'required' => true,
'validators' => array(
array(
'name' => 'CustomTypeValidator'
)
)
),
'qwer' => array(
'name' => 'qwer',
'required' => true,
'filters' => array(
)
'validators' => array(
)
),
'asdf' => array(
'name' => 'asdf',
'required' => true,
'filters' => array(
)
'validators' => array(
)
),
'yxcv' => array(
'name' => 'yxcv',
'required' => true,
'filters' => array(
)
'validators' => array(
)
)
)
您的自定义验证器类:
<?php
namespace Application\Validator;
class CustomTypeValidator extends AbstractValidator{
const INVALID_TYPE = 'invalid_type';
const NOT_ARRAY = 'not_an_array';
protected $messageTemplates = array(
self::NOT_ARRAY => "Type must be an array",
self::INVALID_TYPE => "Type must be a, b or c",
);
public function isValid($value)
{
$this->setValue($value);
if (!is_array($value)) {
$this->error(self::NOT_ARRAY);
return false;
}
if(key($value) === 'a'){
//... validate a
}
if(key($value) === 'b'){
//... validate b
}
if(key($value) === 'c'){
//... validate c
}
$this->error(self::INVALID_TYPE);
return false;
}
}
为了验证a
,b
和c
,您还可以编写验证器类并在自定义类型验证器中实例化并使用它们:
if(key($value) === 'a'){
$validator = new TypeAValidator():
$valid = $validator->isValid($value['a']);
return $valid;
}