除了使用bind()
之外,还有更好的方法将doctrine2 ODM实体类中的数据绑定到Zend2表单吗?
如果是这样,会是什么?我只是将数据检索为数组并传递每个字段吗?我正在努力解决这个问题,并且最有可能使它变得比它需要的更难。
当我调用bind()
函数时,它会输出一个引用默认水合器的Zend错误。我是否需要在我的实体类中做一些特别的事情?
编辑:以下是Zend投掷的确切错误
〜\厂商\ zendframework \ zendframework \库\ Zend的\ STDLIB \保湿\ ArraySerializable.php:35
Zend \ Stdlib \ Hydrator \ ArraySerializable :: extract需要提供 用于实现getArrayCopy()的对象
他们让我觉得我需要:
答案 0 :(得分:14)
对于Zend \ Form能够保护你的实体,你需要在你的实体类中有类似的东西:
public function getArrayCopy()
{
return get_object_vars($this);
}
答案 1 :(得分:2)
在你... / Model / XXXXTable.php
定义一个想要获取记录的函数。
$id = (int)$id;
$row = $this->tableGateway->select(array('id'=>$id));
$row = $row->current(); //this line is very important
答案 2 :(得分:2)
我在module.config.php上使用以下代码来使用doctrine hydrator
$form = new ...;
$dm = $sm->get('doctrine.documentmanager.odm_default');
$form->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($dm));
return $form;
答案 3 :(得分:1)
我在我的实体类中使用populate方法。 像这样的东西
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;
}
然后在控制器中你可以使用像这样的填充函数。
$user = new User();
$request = $this->getRequest();
$user->populate($request->getPost());
我不确定我是否理解你的问题。
答案 4 :(得分:1)
幸运的是,如果您遵循本教程,您的实体中不需要任何其他内容:
http://samminds.com/2012/07/a-blog-application-part-1-working-with-doctrine-2-in-zend-framework-2/我使用几乎相同的方法,它(几乎)运作良好。你应该关心的两件事:
1。)确保验证表中的所有数据(或至少是非空数据),因为只有经过验证的字段才会发送到数据库。这个博客的作者对我说。 :)
2.。)为编辑表单创建视图时,将id添加到路径:
$form->setAttribute('action', $this->url('post',
array('action'=>'add', 'id'=>"$this->id")))->prepare();
祝你好运!