如果规则是字段相关的,如何在ZF2 / Apigility中设置输入验证?

时间:2015-09-28 15:05:15

标签: php validation zend-framework2 apigility

有一个班级Item。它有一个属性type,可以是abc。对于所有类型,有一组共同的最小属性/输入字段: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

此外,barbar的验证规则与type=btype=c的情况略有不同。

如何根据字段(或多个字段)的值在ZF2 / Apigilty应用程序中设置验证?对于这个具体情况:如何根据{设置验证{1}}?

更新

属性type是依赖于的。这意味着 - 如果其他字段(typefoo等)与其不匹配,则应该变为无效。 (它是bar并获得允许值的validated agains an array,就是这样。)

所以,它应该在相反的方向工作:

required

1 个答案:

答案 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;
    }
}

为了验证abc,您还可以编写验证器类并在自定义类型验证器中实例化并使用它们:

    if(key($value) === 'a'){
        $validator = new TypeAValidator():
        $valid = $validator->isValid($value['a']);
        return $valid;
    }