Zend framework2 从doctrine2 ODM绑定Zend2表单数据

Zend framework2 从doctrine2 ODM绑定Zend2表单数据,zend-framework2,doctrine-odm,Zend Framework2,Doctrine Odm,除了使用bind(),还有更好的方法将数据从doctrine2odm实体类绑定到Zend2表单吗 如果是,会是什么?我是否将数据作为数组检索并传递每个字段?我正在努力解决这个问题,很可能会让事情变得更加困难 当我调用bind()函数时,它会输出一个Zend错误,引用默认值。我需要在实体类中做一些特殊的事情吗 编辑:下面是Zend抛出的确切错误 ~\vendor\zendframework\zendframework\library\Zend\Stdlib\Hydrator\arrayseriza

除了使用
bind()
,还有更好的方法将数据从doctrine2odm实体类绑定到Zend2表单吗

如果是,会是什么?我是否将数据作为数组检索并传递每个字段?我正在努力解决这个问题,很可能会让事情变得更加困难

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

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

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

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

他们让我觉得我需要:

  • 使用Zends水合器(我必须研究如何实现)或
  • 使用doctrine2的补水剂(我还必须找出最佳的实施方法)

  • 我在实体类中使用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());
    

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

    幸运的是,如果您遵循本教程,您的实体中不需要更多内容:

    我使用几乎相同的方法,而且(几乎)效果很好。你应该关心两件事:

    1.)确保验证表中的所有数据(或至少非空数据),因为只有经过验证的字段才会发送到数据库。这是这个博客的作者对我说的。:)

    2.)为编辑表单创建视图时,将id添加到管线:

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

    祝你好运

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

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

    在您的…/Model/xxtable.php中
    定义要获取记录的函数

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

    我使用module.config.php中的以下代码来使用

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

    请修改您的问题以包含实际错误消息。ZF2的工作方式是将对象/实体绑定到表单,然后指定的对象或实体确保引用的表单字段正确映射。这实际上是一个非常简单的用例,并且很好地分离了关注点,正如错误消息所给出的那样,您总是知道应该在哪里查找。显然,我希望用户能够编辑他们已经发布的信息。我做了一些研究,发现Zend使用bind()方法从实体中提取数据并填充表单进行编辑。目前我正在做一些类似$form=newform()的事情$表单->绑定($entity)。我的$实体使用docterne2的getServiceLocator(),我使用getQueryBuilder()构建了一个查询。当我导航到我的editAction时,我得到以下错误Zend\Stdlib\Hydrator\ArraySerializable::extract期望提供的对象实现getArrayCopy(),get\u object\u vars函数对此很感兴趣。Reference:-“根据作用域获取给定对象的可访问非静态属性。”为了更清楚,我们将上述方法添加到此文件:
    \zf2 tutorial\module\Album\src\Album\Model\Album.php