【问题标题】:Zend Framework 2 InputFilter error when insert and update data插入和更新数据时 Zend Framework 2 InputFilter 错误
【发布时间】:2014-08-05 10:42:13
【问题描述】:

可捕获的致命错误:参数 1 传递给 Zend\Form\Form::setInputFilter() 必须实现接口 Zend\InputFilter\InputFilterInterface,null 给定,调用 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;
    }
}

模型文件:比萨饼

<?php

namespace Pizza\Model;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterInterface;
use Zend\InputFilter\InputFilterAwareInterface;

class Pizza implements InputFilterAwareInterface
{
    public $id;
    public $name;
    public $ingredients;
    public $smallprice;
    public $bigprice;
    public $familyprice;
    public $partyprice;

    protected $inputFilter;

    public function __construct(){

    }

    public function exchangeArray($data){

        $this->id           = (!empty($data['id']))          ? $data['id']          : null;
        $this->name         = (!empty($data['name']))        ? $data['name']        : null;
        $this->ingredients  = (!empty($data['ingredients'])) ? $data['ingredients'] : null;
        $this->smallprice   = (!empty($data['smallprice']))  ? $data['smallprice']  : null;
        $this->bigprice     = (!empty($data['bigprice']))    ? $data['bigprice']    : null;
        $this->familyprice  = (!empty($data['familyprice'])) ? $data['familyprice'] : null;
        $this->partyprice   = (!empty($data['partyprice']))  ? $data['partyprice']  : null;
    }

    public function getArrayCopy(){

        return get_object_vars($this);
    }

    public function setInputFilter(InputFilterInterface $inputfilter){

        throw new \Exception("not Used");


    }

    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;

        }else{
            return $this->inputFilter;
        }

    }
}

【问题讨论】:

  • 实际上你的模型Pizza有问题,因为输入过滤器是在模型Pizza上定义的。所以请先检查您的模型或请编写模型,以便我们解决您的问题。谢谢。并确保你已经在你的模型上添加了这个namespace Pizza\Model; use Zend\InputFilter\InputFilter; use Zend\InputFilter\InputFilterAwareInterface; use Zend\InputFilter\InputFilterInterface; class Pizza implements InputFilterAwareInterface {...
  • 我添加了模型的代码,你可以检查一下吗pllz:D

标签: php zend-framework2


【解决方案1】:

请在您的getInputFilter 方法中删除else。我认为这是导致错误的原因。这就是您收到错误的原因:null given,$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;
    

}

【讨论】:

  • 当我尝试它时,错误消失了,但数据没有存储在数据库中?
  • 测试条件if ($add_form-&gt;isValid())是否返回true。在 if 语句中尝试echo 'success';。
  • 非常感谢你,终于成功了:D 问题出在这段代码中:return $this->redirect()->toRoute('pizza');在:函数 addAction()
【解决方案2】:

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

【讨论】:

  • 是的,它返回:$inputfilter = new InputFilter(); .... $this->inputFilter = $inputfilter;返回 $this->inputFilter;
猜你喜欢
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多