Doctrine orm 如何为ZF2中的ORM实体创建神奇的geter和setter?

Doctrine orm 如何为ZF2中的ORM实体创建神奇的geter和setter?,doctrine-orm,zend-framework2,Doctrine Orm,Zend Framework2,你好,我是ZendFrame工作的新手。。。我已经按照一些基本教程使用orm构建模块。。我已经成功地完成了所有教程 我现在尝试的是使用如下神奇的getter和setter创建实体,而不是为实体类的每个属性编码所有getter和setter: /* Magic getter to expose protected properties. * * @param string $property * @return mixed */ public functi

你好,我是ZendFrame工作的新手。。。我已经按照一些基本教程使用orm构建模块。。我已经成功地完成了所有教程

我现在尝试的是使用如下神奇的getter和setter创建实体,而不是为实体类的每个属性编码所有getter和setter:

/* Magic getter to expose protected properties.
     *
     * @param string $property
     * @return mixed
     */

public function __get($property) {
    return $this->$property;
}

/**
 * Magic setter to save protected properties.
 *
 * @param string $property
 * @param mixed $value
 */
public function __set($property, $value) {
    $this->$property = $value;
}
这是我在控制器中处理表单的方式:

        $user = new User();
        $builder = new DoctrineAnnotationBuilder($entityManager);
        $form = $builder->createForm($user);
        $form->setHydrator(new DoctrineHydrator($entityManager,'Module/Entity/User'));
        $form->bind($user);

        if($this->getRequest()->isPost()) 
        {
              $form->setData($this->getRequest()->getPost());                 
              if($form->isValid()) {
                $u = $form->getData();
                var_dump($u);exit();
              }
        } 
当我提交数据正确的表单时,表单提交时没有任何错误,但表单中用户对象的属性为空:

object(Module\Entity\User)[272]
  private 'id' => null
  private 'firstname' => null
  private 'lastname' => null
  private 'email' => null
  private 'password' => null
  private 'rdate' => null
  private 'role' => null
这可能是因为表单对象只依赖于绑定到它的对象类的getter和setter。。。。但我不确定…:(


是否有任何解决方案可供magic Getter和Setter使用zend forms???

首先,这与zend Framework 2无关。DoctrineObject水合器负责水合对象

其次,您错误地实例化了对象。如果您查看,第二个参数是一个布尔值,指示是否应该使用实体的公共API(getter/setter方法)

因为您传递了一个字符串,所以它的计算结果总是true,这指示使用者实际使用getter和setter方法,并且因为这些方法不存在,所以不会调用它们

如果希望绕过任何类逻辑,只从具有反射的对象获取/设置值,则应以这种方式实例化对象:

$form->setHydrator(新的DoctrineHydrator($entityManager,false));


然而,在OOP世界中,这是一个可怕的想法-绕过逻辑,使用神奇的方法。初学者倾向于创建这样的快捷方式。请遵循一些关于如何创建的好教程,因为我不打算在这里介绍这些主题。

首先,这与Zend Framework 2无关。DoctrineObject hydrator负责为反对

其次,您错误地实例化了对象。如果您查看,第二个参数是一个布尔值,指示是否应该使用实体的公共API(getter/setter方法)

因为您传递了一个字符串,所以它的计算结果总是true,这指示使用者实际使用getter和setter方法,并且因为这些方法不存在,所以不会调用它们

如果希望绕过任何类逻辑,只从具有反射的对象获取/设置值,则应以这种方式实例化对象:

$form->setHydrator(新的DoctrineHydrator($entityManager,false));


然而,在OOP世界中,这是一个糟糕的想法-绕过逻辑,使用神奇的方法。初学者倾向于创建这样的快捷方式。请遵循一些关于如何创建的好教程,因为我不打算在这里介绍这些主题。

Thnx@mike我在下面的教程中,他们在第二个参数中传递字符串,我认为这可能是t的名称空间he class…官方教程过时了:)Thnx@mike我在跟随教程,他们在第二个参数中传递字符串,我认为这可能是类的名称空间…官方教程过时了:)