Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation ZF2简单表单验证_Validation_Zend Framework2_Zend Form - Fatal编程技术网

Validation ZF2简单表单验证

Validation ZF2简单表单验证,validation,zend-framework2,zend-form,Validation,Zend Framework2,Zend Form,几天来,我一直试图在zend framework 2中验证一个简单的表单。 我查看了文档和很多关于这个主题的帖子,但没有找到解决方案 我有一个非常简单的表格: class AlimentForm extends Form { public function __construct($name = null) { parent::__construct('aliment'); $this->add(array( 'required'=>true,

几天来,我一直试图在zend framework 2中验证一个简单的表单。 我查看了文档和很多关于这个主题的帖子,但没有找到解决方案

我有一个非常简单的表格:

class AlimentForm extends Form
{
public function __construct($name = null)
{
    parent::__construct('aliment');

    $this->add(array(
        'required'=>true,
        'name' => 'year',
        'type' => 'Text',
        'options' => array(
            'label' => 'Jahr',
        ),
    ));
    $this->add(array(
        'required'=>true,
        'name' => 'number',
        'type' => 'Text',
        'options' => array(
            'label' => 'Number',
        ),
    ));
    $this->add(array(
        'name' => 'submit',
        'type' => 'Submit',
        'attributes' => array(
            'value' => 'Go',
            'id' => 'submitbutton',
        ),
    ));
}
}
我创建了一个自定义InputFilter:

namespace Application\Form;

use Zend\InputFilter\InputFilter;
class AlimentInputFilter extends InputFilter {
    public function init()
    {
    $this->add([
        'name'       => AlimentForm::year,
        'required'   => true,
        'validators' => array(
          array(
              'name' => 'Between',
              'options' => array(
                  'min' => 1900,
                  'max' => 3000,
              ),
          ),
        ),
    ]);
}
}
最后,在我的控制器中,我尝试验证表单

public function alimentAction(){
    $form = new AlimentForm();

    $form->setInputFilter(new AlimentInputFilter());

    $request = $this->getRequest();
    if ($request->isPost()) {
       $form->setData($request->getPost());

       if ($form->isValid()) {
           $year = $form->get('year')->getValue();
           $number = $form->get('number')->getValue();

           return array('result' => array(
               "msg" => "In the Year ".$year." you get ".$number." Points"
           ));
       }
    }
    return array('form' => $form);
}
这可能没那么难,但从我在网上找到的各种验证表单的方法来看,我有点困惑

我错过了什么

提前问候和感谢
好的,我解决了这个问题

我为aliment表单创建了一个模型,它有一个year和一个number属性 我在该模型中定义了一个输入过滤器:

use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;

class Aliment implements InputFilterAwareInterface
{
    public $year;
    public $number;

    public function exchangeArray($data){
        $this->year             = (!empty($data['year']))?$data['year']:null;
        $this->number          = (!empty($data['number']))?$data['number']:null;
    }

    public function setInputFilter(InputFilterInterface $inputFilter)
    {
        throw new \Exception("Not used");
    }

    public function getInputFilter()
    {
        if (!$this->inputFilter) {
            $inputFilter = new InputFilter();


            $inputFilter->add(array(
                'name'     => 'year',
                'required' => true,
                'filters'  => array(
                    array('name' => 'StripTags'),
                    array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name' => 'Between',
                        'options' => array(
                            'min' => 1900, 
                            'max' => 3000
                        )
                    )
                ),
            ));

            $inputFilter->add(array(
                'name'     => 'number',
                'required' => true,
                'filters'  => array(
                    array('name' => 'StripTags'),
                    array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name' => 'Between',
                        'options' => array(
                            'min' => 1, 
                            'max' => 10
                        )
                    )
                ),
            ));

            $this->inputFilter = $inputFilter;
        }

        return $this->inputFilter;
    }

}
在控制器的操作方法中,我能够将模型的InputFilter设置为表单,瞧!成功了

public function alimentAction(){
    $form = new AlimentForm();

    $request = $this->getRequest();
    if ($request->isPost()) {
        $aliment = new \Application\Model\Aliment;
        $form->setInputFilter($aliment->getInputFilter());
        $form->setData($request->getPost());


        if ($form->isValid()) {
            $aliment->exchangeArray($form->getData());
            $year           = $form->get('year')->getValue();
            return array(
                'result' => array(
                    //your result
                )
            );
        }
    }
    return array('form' => $form);
}
表单现在已正确验证,并返回相应的错误消息

我希望,它能帮助那些在验证方面遇到类似问题的人