Zend 3. $form->bind($book) вызывает ошибку must be an instance of Zend\Hydrator\object, instance of Application\Model\Book given

При вызове функции $form->bind($book) получаю ошибку

Добавил в Book.php метод getArrayCopy() вроде должно всё работать но не работает

уже долго мучаюсь чтобы найти решение

HEEEEELP

E:\Doniyor\phpStorm\igs.kg\vendor\zendframework\zend-hydrator\src\ArraySerializableHydrator.php:27

Argument 1 passed to Zend\Hydrator\ArraySerializableHydrator::extract() must be an instance of Zend\Hydrator\object, instance of Application\Model\Book given, called in E:\Doniyor\phpStorm\igs.kg\vendor\zendframework\zend-form\src\Fieldset.php on line 650

#0 E:\Doniyor\phpStorm\igs.kg\vendor\zendframework\zend-form\src\Fieldset.php(650): Zend\Hydrator\ArraySerializableHydrator->extract(Object(Application\Model\Book))
#1 E:\Doniyor\phpStorm\igs.kg\vendor\zendframework\zend-form\src\Form.php(968): Zend\Form\Fieldset->extract()
#2 E:\Doniyor\phpStorm\igs.kg\vendor\zendframework\zend-form\src\Form.php(303): Zend\Form\Form->extract()
#3 E:\Doniyor\phpStorm\igs.kg\module\Application\src\Controller\BookController.php(77): Zend\Form\Form->bind(Object(Application\Model\Book))
#4 E:\Doniyor\phpStorm\igs.kg\vendor\zendframework\zend-mvc\src\Controller\AbstractActionController.php(78): Application\Controller\BookController->editAction()
#5 E:\Doniyor\phpStorm\igs.kg\vendor\zendframework\zend-eventmanager\src\EventManager.php(322): Zend\Mvc\Controller\AbstractActionController->onDispatch(Object(Zend\Mvc\MvcEvent))
#6 E:\Doniyor\phpStorm\igs.kg\vendor\zendframework\zend-eventmanager\src\EventManager.php(179): Zend\EventManager\EventManager->triggerListeners(Object(Zend\Mvc\MvcEvent), Object(Closure))
#7 E:\Doniyor\phpStorm\igs.kg\vendor\zendframework\zend-mvc\src\Controller\AbstractController.php(106): Zend\EventManager\EventManager->triggerEventUntil(Object(Closure), Object(Zend\Mvc\MvcEvent))
#8 E:\Doniyor\phpStorm\igs.kg\vendor\zendframework\zend-mvc\src\DispatchListener.php(138): Zend\Mvc\Controller\AbstractController->dispatch(Object(Zend\Http\PhpEnvironment\Request), Object(Zend\Http\PhpEnvironment\Response))
#9 E:\Doniyor\phpStorm\igs.kg\vendor\zendframework\zend-eventmanager\src\EventManager.php(322): Zend\Mvc\DispatchListener->onDispatch(Object(Zend\Mvc\MvcEvent))
#10 E:\Doniyor\phpStorm\igs.kg\vendor\zendframework\zend-eventmanager\src\EventManager.php(179): Zend\EventManager\EventManager->triggerListeners(Object(Zend\Mvc\MvcEvent), Object(Closure))
#11 E:\Doniyor\phpStorm\igs.kg\vendor\zendframework\zend-mvc\src\Application.php(332): Zend\EventManager\EventManager->triggerEventUntil(Object(Closure), Object(Zend\Mvc\MvcEvent))
#12 E:\Doniyor\phpStorm\igs.kg\public\index.php(40): Zend\Mvc\Application->run()
#13 {main}

BookController.php

/* остальной код */
public function editAction()
{
    $id = (int) $this->params()->fromRoute('id', 0);

    if (0 === $id) {
        return $this->redirect()->toRoute('book', ['action' => 'add']);
    }

    try {
        $book = $this->table->getBook($id);
    } catch (\Exception $e) {
        return $this->redirect()->toRoute('album', ['action' => 'index']);
    }

    $form = new BookForm();
    $form->bind($book);
    $form->get('submit')->setAttribute('value', 'Edit');

    $request = $this->getRequest();
    $viewData = ['id' => $id, 'form' => $form, 'template' => 'add'];

    if (! $request->isPost()) {
        return $viewData;
    }

    $form->setInputFilter($book->getInputFilter());
    $form->setData($request->getPost());

    if (! $form->isValid()) {
        return $viewData;
    }

    $this->table->saveBook($book);

    // Redirect to album list
    return $this->redirect()->toRoute('book', ['action' => 'index']);
}
/* остальной код */

Book.php

class Book implements InputFilterAwareInterface
{
    public $id;
    public $name;
    private $quantity;
    private $inRent;

    private $inputFilter;

    public function exchangeArray(array $data)
    {
        $this->id       = !empty($data['id']) ? $data['id'] : null;
        $this->name     = !empty($data['name']) ? $data['name'] : null;
        $this->quantity = $data['quantity'];
        $this->inRent = $data['in_rent'];
    }

    public function getArrayCopy()
    {
        return [
            'id'     => $this->id,
            'name' => $this->name,
            'quantity'  => $this->quantity,
            'in_rent'  => $this->inRent,
        ];
    }
}

BookTable.php

class BookTable
{

    /* остальной код */

    public function getBook($id)
    {
        $id = (int)$id;
        $rowset = $this->tableGateway->select(['id' => $id]);
        $row = $rowset->current();
        if (!$row) {
            throw new RuntimeException(sprintf(
                'Could not find row with identifier %d',
                $id
            ));
        }

        return $row;
    }

    /* остальной код */
}

Ответы (1 шт):

Автор решения: Don Valijanov

версия php у меня было 7.1, а надо выше чем 7.2

→ Ссылка