绑定来自doctrine2 ODM的Zend2表单数据

时间:2012-10-23 20:06:14

标签: zend-framework2 doctrine-odm

除了使用bind()之外,还有更好的方法将doctrine2 ODM实体类中的数据绑定到Zend2表单吗?

如果是这样,会是什么?我只是将数据检索为数组并传递每个字段吗?我正在努力解决这个问题,并且最有可能使它变得比它需要的更难。

当我调用bind()函数时,它会输出一个引用默认水合器的Zend错误。我是否需要在我的实体类中做一些特别的事情?

编辑:以下是Zend投掷的确切错误

  

〜\厂商\ zendframework \ zendframework \库\ Zend的\ STDLIB \保湿\ ArraySerializable.php:35

     

Zend \ Stdlib \ Hydrator \ ArraySerializable :: extract需要提供   用于实现getArrayCopy()的对象

他们让我觉得我需要:

  1. 使用Zends水化器(我必须研究如何实施)或
  2. 使用doctrine2的保湿剂(我也必须找出实施的最佳方法)

5 个答案:

答案 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();
祝你好运!