Zend\Stdlib\Exception\BadMethodCallException
Zend\Stdlib\Exception\BadMethodCallException
这是我遇到问题的堆栈跟踪部分:
Zend\Stdlib\Exception\BadMethodCallException
文件:
/var/www/html/zf2/vendor/zendframework/zendframework/library/Zend/Stdlib/Hydrator/ArraySerializable.php:28
信息:
Zend\Stdlib\Hydrator\ArraySerializable::extract 期望提供的对象实现 getArrayCopy()
堆栈跟踪:
0 /var/www/html/zf2/vendor/zendframework/zendframework/library/Zend/Form/Fieldset.php(631): Zend\Stdlib\Hydrator\ArraySerializable->提取(对象(BookList\Model\Book))
1 /var/www/html/zf2/vendor/zendframework/zendframework/library/Zend/Form/Form.php(942): Zend\Form\Fieldset->提取()
2 /var/www/html/zf2/vendor/zendframework/zendframework/library/Zend/Form/Form.php(303): Zend\Form\Form->提取()
3 /var/www/html/zf2/module/BookList/src/BookList/Controller/BookController.php(59): Zend\Form\Form->bind(对象(BookList\Model\Book))
我的控制器中调用绑定的操作方法:
public function editAction()
{
$id = (int) $this->params()->fromRoute('id', 0);
if (!$id) {
return $this->redirect()->toRoute('book');
}
try {
$book = $this->getBookTable()->getBook($id);
}
catch (\Exception $ex) {
return $this->redirect()->toRoute('book', array(
'action' => 'index'
));
}
$form = new BookForm();
$form->bind($book); // this is the line 59 of BookController
$form->get('submit')->setAttribute('value', 'Edit');
$request = $this->getRequest();
if ($request->isPost()) {
$form->setInputFilter($book->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) {
$this->getBookTable()->saveBook($book);
// Redirect to list of books
return $this->redirect()->toRoute('book');
}
}
return array(
'id' => $id,
'form' => $form,
);
}
我还检查了 BookTable class 以查看从结果集返回的对象,它是 Book 的实例。
比我打开 ArratSerializable.php 并检查传递的对象和 tre 响应是:
BookList\Model\Book Object ( [id] => 5 [author] => Gotye [title] => Making Mirrors [inputFilter:protected] => )
所以它是一个正确的对象,为什么它不起作用?
您通常会在构建模型时告诉 ResultSet
对象如何返回结果。你实际上在那里设置了一个原型来返回你的结果集说,嘿! "Use this prototype" 在您的情况下是 Book
模型。它确实有一个缺少的名为 getArrayCopy()
的方法。在这种情况下,这实际上会增加错误。所以请将此添加到 Book
模型中
class Book
{
// other properties and methods should be here
// add this method here
public function getArrayCopy()
{
return get_object_vars($this);
}
}
这是我遇到问题的堆栈跟踪部分:
Zend\Stdlib\Exception\BadMethodCallException
文件: /var/www/html/zf2/vendor/zendframework/zendframework/library/Zend/Stdlib/Hydrator/ArraySerializable.php:28 信息: Zend\Stdlib\Hydrator\ArraySerializable::extract 期望提供的对象实现 getArrayCopy() 堆栈跟踪:
0 /var/www/html/zf2/vendor/zendframework/zendframework/library/Zend/Form/Fieldset.php(631): Zend\Stdlib\Hydrator\ArraySerializable->提取(对象(BookList\Model\Book))
1 /var/www/html/zf2/vendor/zendframework/zendframework/library/Zend/Form/Form.php(942): Zend\Form\Fieldset->提取()
2 /var/www/html/zf2/vendor/zendframework/zendframework/library/Zend/Form/Form.php(303): Zend\Form\Form->提取()
3 /var/www/html/zf2/module/BookList/src/BookList/Controller/BookController.php(59): Zend\Form\Form->bind(对象(BookList\Model\Book))
我的控制器中调用绑定的操作方法:
public function editAction()
{
$id = (int) $this->params()->fromRoute('id', 0);
if (!$id) {
return $this->redirect()->toRoute('book');
}
try {
$book = $this->getBookTable()->getBook($id);
}
catch (\Exception $ex) {
return $this->redirect()->toRoute('book', array(
'action' => 'index'
));
}
$form = new BookForm();
$form->bind($book); // this is the line 59 of BookController
$form->get('submit')->setAttribute('value', 'Edit');
$request = $this->getRequest();
if ($request->isPost()) {
$form->setInputFilter($book->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) {
$this->getBookTable()->saveBook($book);
// Redirect to list of books
return $this->redirect()->toRoute('book');
}
}
return array(
'id' => $id,
'form' => $form,
);
}
我还检查了 BookTable class 以查看从结果集返回的对象,它是 Book 的实例。
比我打开 ArratSerializable.php 并检查传递的对象和 tre 响应是:
BookList\Model\Book Object ( [id] => 5 [author] => Gotye [title] => Making Mirrors [inputFilter:protected] => )
所以它是一个正确的对象,为什么它不起作用?
您通常会在构建模型时告诉 ResultSet
对象如何返回结果。你实际上在那里设置了一个原型来返回你的结果集说,嘿! "Use this prototype" 在您的情况下是 Book
模型。它确实有一个缺少的名为 getArrayCopy()
的方法。在这种情况下,这实际上会增加错误。所以请将此添加到 Book
模型中
class Book
{
// other properties and methods should be here
// add this method here
public function getArrayCopy()
{
return get_object_vars($this);
}
}