簡體   English   中英

插入和更新數據時Zend Framework 2 InputFilter錯誤

[英]Zend Framework 2 InputFilter error when insert and update data

可捕獲的致命錯誤:傳遞給Zend \\ Form \\ Form :: setInputFilter()的參數1必須實現Zend \\ InputFilter \\ InputFilterInterface接口,給定為null,在C:\\ xampp \\ htdocs \\ pizza \\ module \\ Pizza \\ src \\ Pizza \\ Controller中調用第52行的\\ PizzaController.php,並在第652行的C:\\ xampp \\ htdocs \\ pizza \\ vendor \\ zendframework \\ zendframework \\ library \\ Zend \\ Form \\ Form.php中定義

這是文件:

 <?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-> getInputFilter()返回的對象是否實現了Zend \\ InputFilter \\ InputFilterInterface接口。 因為您的Form類的setInputFilter()方法僅接受此類對象。

請在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;


}

希望能幫助到你 !

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM