7

除了使用之外,还有没有更好的方法将数据从一个学说 2 ODM 实体类绑定到一个 Zend2 表单bind()

如果是这样,那会是什么?我是否只需将数据作为数组检索并传递每个单独的字段?我正在为此苦苦挣扎,而且很可能使它变得比需要的更难。

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

编辑:这是 Zend 抛出的确切错误

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

Zend\Stdlib\Hydrator\ArraySerializable::extract 期望提供的对象实现 getArrayCopy()

他们让我觉得我需要:

  1. 使用 Zends 水合器(我必须研究如何实施)或
  2. 使用学说 2 的水合器(我还必须找出实现的最佳方法)
4

5 回答 5

14

为了使 Zend\Form 能够水合你的实体,你需要在你的实体类中有类似的东西:

public function getArrayCopy()
{
    return get_object_vars($this);
}
于 2013-03-22T00:00:08.250 回答
2

在你.../Model/XXXXTable.php 中
定义一个想要获取记录的函数。

    $id = (int)$id;
    $row = $this->tableGateway->select(array('id'=>$id));
    $row = $row->current();    //this line is very important
于 2013-09-04T05:46:53.040 回答
2

我在 module.config.php 中使用以下代码来使用教义水合器

$form = new ...;
$dm = $sm->get('doctrine.documentmanager.odm_default');
$form->setHydrator(new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($dm));
return $form;
于 2014-06-26T07:37:31.537 回答
1

我在我的实体类中使用填充方法。像这样的东西

  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());

我不确定我是否正确理解了您的问题。

于 2012-10-24T14:43:34.367 回答
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();

祝你好运!

于 2012-10-30T08:30:50.653 回答