Zend框架1.6使用Zend Filter Input验证POST请求

时间:2014-08-24 13:59:01

标签: php zend-framework

使用Zend framework 1.6,我会收到这样的POST请求:

array(2) {
  ["checkins"] => array(18) {
    ["nome"] => string(6) "MYNAME" //the field is correctly filled
    ["pec"] => string(0) ""
    ["sito_web"] => string(0) ""
    ["note"] => string(0) ""
  }
  ["users"] => array(19) {
    ["email"] => string(29) "email@gmail.com"
    ["u_id"] => string(1) "1"
  }
}

验证' nome'字段我正在使用Zend输入过滤器。这是我的验证器数组:

    $validators = array (
                'nome' => array (
                        'presence' => 'required'
    ));
    $params = $this->getRequest ()->getPost ();

    $input = new Zend_Filter_Input ( array (), $validators,$params );

    if (! $input->isValid ()) {
        print_r($input->getMessages ());
    }

似乎验证不是很好,因为我收到了消息:

Field 'nome' is required by rule 'nome', but the field is missing

在我看来,我的$ validators数组中有一个错误,但我无法找到它。

1 个答案:

答案 0 :(得分:1)

您的问题是,您在html表单中使用数组表示法。

你的html中可能有这样的东西:

<form ...>
...
<input type="text" name="checkins[nome]" ... /> 
...
</form>

这在表单元素中称为数组表示法。

您可以通过调用:

在ZF中获取此数组
$request = $this->getRequest();

    if($request->isPost()) {

        $post = $request->getPost();

        $validators = array (
            //nome has to be present and not empty
            'checkins' => array(
                'nome' => array(
                    'NotEmpty',
                    'presence' => 'required'
                ),
                //if pec is present, it has to be not empty
                'pec' => array(
                    'NotEmpty'
                )
            )
        );

        //validate the post array
        $input = new Zend_Filter_Input( array(), $validators, $post);

        if (!$input->isValid()) {
            Zend_Debug::dump($input->getMessages());
        }

        Zend_Debug::dump($post);
    }

但有些事情正在发生,我不明白..

如果使用下一种方法,一切正常......

$request = $this->getRequest();

$checkins = $request->getPost('checkins');

$validators = array (
    //nome has to be present and not empty
    'nome' => array(
        'NotEmpty',
        'presence' => 'required'
    ),
    //if pec is present, it has to be not empty
    'pec' => array(
        'NotEmpty'
    )
);

//validate the checkins array instead of the whole array
$checkinsFilter = new Zend_Filter_Input( array(), $validators, $checkins);

if (!$checkinsFilter->isValid()) {
    Zend_Debug::dump($checkinsFilter->getMessages());
}

希望它有所帮助。

在此处阅读有关 Zend_Validate_Input 和元命令的更多信息: http://framework.zend.com/manual/1.6/de/zend.filter.input.html#zend.filter.input.metacommands.presence

更多关于可用验证器类的信息: http://framework.zend.com/manual/1.6/de/zend.validate.set.html

也许可以考虑使用Zend_Form生成一个包含所需验证器,过滤器和元素的Object。您不需要使用此表单来呈现html输出。但是使用它进行验证和过滤要比为所有类型的表单手动操作简单得多。

玩得开心,祝你好运!