Php 插入和更新数据时Zend Framework 2 InputFilter错误

Php 插入和更新数据时Zend Framework 2 InputFilter错误,php,zend-framework2,Php,Zend Framework2,可捕获致命错误:参数1传递给 Zend\Form\Form::setInputFilter()必须实现接口 Zend\InputFilter\InputFilterInterface,给定为空,在中调用 C:\xampp\htdocs\pizza\module\pizza\src\pizza\Controller\PizzaController.php 第52行,并在中定义 C:\xampp\htdocs\pizza\vendor\zendframework\zendframework\libr

可捕获致命错误:参数1传递给 Zend\Form\Form::setInputFilter()必须实现接口 Zend\InputFilter\InputFilterInterface,给定为空,在中调用 C:\xampp\htdocs\pizza\module\pizza\src\pizza\Controller\PizzaController.php 第52行,并在中定义 C:\xampp\htdocs\pizza\vendor\zendframework\zendframework\library\Zend\Form\Form.php 在线652

这是文件:

 <?php
namespace Pizza\Controller;

use Zend\Mvc\Controller\AbstractActionController;

use Pizza\Form\AddPizzaForm;

use Pizza\Form\EditPizzaForm;

use Zend\View\Model\ViewModel;

use Pizza\Model\Pizza;

use Zend\View\Model\JSonModel;


class PizzaController extends AbstractActionController{
    protected $pizzaTable;

    public function indexAction()
    {
        return new ViewModel(array('pizzas' => $this->getPizzaTable()->find_all()));
    }

    public function addAction()
    {
        $add_form = new AddPizzaForm();
        $request = $this->getRequest();
        if ($request->isPost()) {

            $pizza = new Pizza();
            $add_form->setInputFilter($pizza->getInputFilter());
            $add_form->setData($request->getPost());

            if ($add_form->isValid()) {
                $pizza->exchangeArray($add_form->getData());
                $this->getPizzaTable()->save($pizza);
            }

            return $this->redirect()->toRoute('pizza');
        }

        return array('form' => $add_form);
    }

    public function editAction()
    {
        $id = (int) $this->params()->fromRoute('id',0);
        if ($id == 0) {
            //redirect to index action Route.
            return $this->redirect()->toRoute('pizza');

        }else{

            $pizza      = $this->getPizzaTable()->find_by_id($id);
            $edit_form  = new EditPizzaForm();
            $edit_form->bind($pizza);

            $request = $this->getRequest();
            if ($request->isPost()) {
                $edit_form->setInputFilter($pizza->getInputFilter());
                $edit_form->setData($request->getPost());

                if ($edit_form->isValid()) {
                    $this->getPizzaTable()->save($pizza);
                    return $this->redirect()->toRoute('pizza');   
                }
            }

            return array('id'=> $id,'form' => $edit_form);
        }
    }

    public function deleteAction()
    {
        $id = (int) $_POST['id'];
        $this->getPizzaTable()->delete($id);
        $msg = "good";

        $response = new JSonModel(array('response' => $msg));

        return $response;
    }

    public function getPizzaTable()
    {
        if (!$this->pizzaTable) {
            $sm = $this->getServiceLocator();
            $this->pizzaTable = $sm->get('Pizza\Model\PizzaTable');
        }

        return $this->pizzaTable;
    }
}

您应该检查$pizza->getInputFilter()是否返回一个实现Zend\InputFilter\InputFilterInterface接口的对象。因为表单类的setInputFilter()方法只接受此类对象

请删除
getInputFilter
方法中的
else
。我认为这就是造成错误的原因。这就是为什么会出现错误:
null如果给定
$inputfilter
将不会第一次返回

我帮你改正了。用以下方法替换您的方法:

public function getInputFilter(){

    if (!$this->inputFilter) {

        $inputfilter = new InputFilter();

        $inputfilter->add(array(
            'name'      => 'name',
            'required'  => true,
            'filters'   => array(
                array('name'  => 'StringTrim'),
                array('name'  => 'StripTags')
                ),
            'validators'=> array(
                array('name'   => 'StringLength',
                'options'=> array(
                    'encoding'  => 'UTF-8',
                    'min'       => 5,
                    'max'       =>30,
                    ))
                )
            ));

        $inputfilter->add(array(
            'name'=> 'ingredients',
            'required'  => true,
            'filters'   => array(
                array('name'  => 'StringTrim'),
                array('name'  => 'StripTags')
                ),
            'validators'=> array(
                array('name'   => 'StringLength',
                'options'=> array(
                    'encoding'  => 'UTF-8',
                    'min'       => 5,
                    'max'       =>255,
                    ))
                )
            ));

        $inputfilter->add(array(
            'name'      => 'smallprice',
            'required'  => true,
            'filters'   => array(
                array('name'  => 'StringTrim'),
                array('name'  => 'StripTags')
                ),
            'validators'=> array(
                array('name'   => 'StringLength',
                'options'=> array(
                    'encoding'  => 'UTF-8',
                    'min'       => 1,
                    'max'       => 5,
                    ))
                )
            ));

        $inputfilter->add(array(
            'name'      => 'bigprice',
            'required'  => true,
            'filters'   => array(
                array('name'  => 'StringTrim'),
                array('name'  => 'StripTags')
                ),
            'validators'=> array(
                array('name'   => 'StringLength',
                'options'=> array(
                    'encoding'  => 'UTF-8',
                    'min'       => 1,
                    'max'       => 5,
                    ))
                )
            ));

        $inputfilter->add(array(
            'name'  => 'familyprice',
            'required'  => true,
            'filters'   => array(
                array('name'  => 'StringTrim'),
                array('name'  => 'StripTags')
                ),
            'validators'=> array(
                array('name'   => 'StringLength',
                'options'=> array(
                    'encoding'  => 'UTF-8',
                    'min'       => 1,
                    'max'       => 5,
                    ))
                )
            ));

        $inputfilter->add(array(
            'name'=> 'partyprice',
            'required'  => true,
            'filters'   => array(
                array('name'  => 'StringTrim'),
                array('name'  => 'StripTags')
                ),
            'validators'=> array(
                array('name'   => 'StringLength',
                'options'=> array(
                    'encoding'  => 'UTF-8',
                    'min'       => 1,
                    'max'       => 5,
                    ))
                )
            ));

        $this->inputFilter = $inputfilter;

    }
        return $this->inputFilter;


}

希望有帮助

实际上,名为
Pizza
的模型存在问题,因为输入过滤器是在Model
Pizza
上定义的。所以请先检查你的模型,或者写下模型,这样我们可以解决你的问题。谢谢并确保您已经在您的模型上添加了这个
namespace Pizza\Model;使用Zend\InputFilter\InputFilter;使用Zend\InputFilter\InputFilterAwareInterface;使用Zend\InputFilter\InputFilterInterface;类Pizza实现了InputFilterAwareInterface{…
我添加了模型的代码你能检查它吗pllz:染色它返回:$inputfilter=new inputfilter();…..$this->inputfilter=$inputfilter;返回$this->inputfilter;当我尝试它时,错误消失了,但数据没有存储在DB中?测试条件是否
if($add_form->isValid())
返回
true
。尝试
在if语句中回显'success';
。非常感谢您,它终于起作用了:D问题出在这一系列代码中:return$this->redirect()->toRoute('pizza');在:函数addAction()中
public function getInputFilter(){

    if (!$this->inputFilter) {

        $inputfilter = new InputFilter();

        $inputfilter->add(array(
            'name'      => 'name',
            'required'  => true,
            'filters'   => array(
                array('name'  => 'StringTrim'),
                array('name'  => 'StripTags')
                ),
            'validators'=> array(
                array('name'   => 'StringLength',
                'options'=> array(
                    'encoding'  => 'UTF-8',
                    'min'       => 5,
                    'max'       =>30,
                    ))
                )
            ));

        $inputfilter->add(array(
            'name'=> 'ingredients',
            'required'  => true,
            'filters'   => array(
                array('name'  => 'StringTrim'),
                array('name'  => 'StripTags')
                ),
            'validators'=> array(
                array('name'   => 'StringLength',
                'options'=> array(
                    'encoding'  => 'UTF-8',
                    'min'       => 5,
                    'max'       =>255,
                    ))
                )
            ));

        $inputfilter->add(array(
            'name'      => 'smallprice',
            'required'  => true,
            'filters'   => array(
                array('name'  => 'StringTrim'),
                array('name'  => 'StripTags')
                ),
            'validators'=> array(
                array('name'   => 'StringLength',
                'options'=> array(
                    'encoding'  => 'UTF-8',
                    'min'       => 1,
                    'max'       => 5,
                    ))
                )
            ));

        $inputfilter->add(array(
            'name'      => 'bigprice',
            'required'  => true,
            'filters'   => array(
                array('name'  => 'StringTrim'),
                array('name'  => 'StripTags')
                ),
            'validators'=> array(
                array('name'   => 'StringLength',
                'options'=> array(
                    'encoding'  => 'UTF-8',
                    'min'       => 1,
                    'max'       => 5,
                    ))
                )
            ));

        $inputfilter->add(array(
            'name'  => 'familyprice',
            'required'  => true,
            'filters'   => array(
                array('name'  => 'StringTrim'),
                array('name'  => 'StripTags')
                ),
            'validators'=> array(
                array('name'   => 'StringLength',
                'options'=> array(
                    'encoding'  => 'UTF-8',
                    'min'       => 1,
                    'max'       => 5,
                    ))
                )
            ));

        $inputfilter->add(array(
            'name'=> 'partyprice',
            'required'  => true,
            'filters'   => array(
                array('name'  => 'StringTrim'),
                array('name'  => 'StripTags')
                ),
            'validators'=> array(
                array('name'   => 'StringLength',
                'options'=> array(
                    'encoding'  => 'UTF-8',
                    'min'       => 1,
                    'max'       => 5,
                    ))
                )
            ));

        $this->inputFilter = $inputfilter;

    }
        return $this->inputFilter;


}