[英]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.