【问题标题】:Binding Zend2 form data from doctrine2 ODM从教义2 ODM 绑定Zend2 表单数据
【发布时间】:2012-10-23 20:06:13
【问题描述】:

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

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

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

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

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

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

他们让我觉得我需要:

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

【问题讨论】:

  • 请修改您的问题以包含实际的错误消息。 ZF2 的工作方式是将对象/实体绑定到表单,然后分配的 Hydrator 确保引用的表单字段被正确映射。这实际上是一个非常简单的用例,并且很好地分离了关注点,正如错误消息所给出的那样,您将始终知道在哪里查看。

标签: zend-framework2 doctrine-odm


【解决方案1】:

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

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

【讨论】:

  • 对 get_object_vars 函数很感兴趣。参考:get_object_vars - “根据范围获取给定对象的可访问非静态属性。”
  • 为了更清楚,我们将上述方法添加到此文件中:\zf2-tutorial\module\Album\src\Album\Model\Album.php
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 基本上,我的问题与 editAction() 有关。显然,我希望用户能够编辑他们已经发布的信息。我做了一些研究,发现 Zend 使用了一种 bind() 方法,该方法将从我的实体中提取数据并填充表单以进行编辑。目前我正在做类似 $form = new Form(); $form->bind($entity)。我的 $entity 正在使用 doctrne2 的 getServiceLocator(),我使用 getQueryBuilder() 构建了一个查询。当我导航到我的 editAction 时,我收到以下错误 Zend\Stdlib\Hydrator\ArraySerializable::extract 期望提供的对象实现 getArrayCopy()
      【解决方案5】:

      幸运的是,如果您遵循本教程,您的实体中不需要任何其他内容:

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

      祝你好运!

      【讨论】:

        猜你喜欢
        • 2013-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-26
        • 1970-01-01
        • 2017-05-06
        相关资源
        最近更新 更多