7
votes

Is there a better way to bind data from a doctrine2 ODM entity class to a Zend2 form besides using bind()?

If so, what would it be? Would I just retrieve the data as an array and pass each individual field? I am struggling with this and most likely making it harder than it needs to be.

When I call the bind() function it outputs a Zend error referencing the default hydrator. Do I need to do something special in my entity class?

Edit: Here are the exact errors Zend is throwing

~\vendor\zendframework\zendframework\library\Zend\Stdlib\Hydrator\ArraySerializable.php:35

Zend\Stdlib\Hydrator\ArraySerializable::extract expects the provided object to implement getArrayCopy()

They make me think I need to either:

  1. use Zends hydrators (which I'd have to research how to implement) or
  2. use doctrine2's hydrators (which, I'd also have to figure out the best way to implement)
5
Please modify your question to contain the actual error message. The way ZF2 works you bind an object/entity to your form and then the assigned Hydrator makes sure the referenced Form-Fields are mapped appropriately. This actually is a very simple use-case and a good separation of concerns, as given by error messages you'll always know WHERE to look. - Sam

5 Answers

14
votes

For Zend\Form being able to hydrating your entity you need to have something like that in your entity class:

public function getArrayCopy()
{
    return get_object_vars($this);
}
2
votes

in you .../Model/XXXXTable.php
define a function want to get a record.

    $id = (int)$id;
    $row = $this->tableGateway->select(array('id'=>$id));
    $row = $row->current();    //this line is very important
2
votes

I use the following code at module.config.php to use doctrine hydrator

$form = new ...;
$dm = $sm->get('doctrine.documentmanager.odm_default');
$form->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($dm));
return $form;
1
votes

I use the populate method in my entity class. something like this

  public function populate($data = array())
    {
        $this->id = ( isset($data['id'])) ? $data['id'] : null;
        $this->username = (isset($data['username'])) ? $data['username'] : null;
        $this->pass = (isset($data['pass'])) ? $data['pass'] : null;               

    }

and then in controller you can use populate function something like this.

$user = new User();
$request = $this->getRequest();
$user->populate($request->getPost());

I am not sure if I understand your quesiton correctly.

1
votes

Fortunately, you do not need anything more in your entities if you follow this tutorial:

http://samminds.com/2012/07/a-blog-application-part-1-working-with-doctrine-2-in-zend-framework-2/ I use nearly the same approach and it is (almost) working well. Two things you should care:

1.) Be sure you validate all data you have in your tables (or at least the not null ones), because only validated fields are sent to the DB. It was said to me by the author of this blog. :)

2.) When you create the view for the edit form, add the id to the route:

$form->setAttribute('action', $this->url('post',
                    array('action'=>'add', 'id'=>"$this->id")))->prepare();

Good luck!