首页 文章

如何在ZF2中为教义ORM实体创建魔法geters和setter?

提问于
浏览
0

您好我是ZendFrame工作的新手......我已经按照一些基本教程使用doctrine 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();
              }
        }

当我提交带有正确数据的表单时,表单提交时没有任何错误,但表单中User对象的属性为null:

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

这可能是因为Form对象仅在绑定到它的对象类的getter和setter上进行中继....但我不确定...... :(

是否有任何解决方案可以使用魔法getter和setter来处理zend表单?

1 回答

  • 2

    首先,这与Zend Framework 2无关.MantrineObject水合器负责保湿对象 .

    其次,你错误地实例化水化器 . 如果查看its source,则第二个参数是一个布尔值,指示是否应该使用实体的公共API(getter / setter方法) .

    因为你传递一个字符串,它总是计算为true,它指示水合器实际使用getter和setter方法,并且因为这些方法不存在,所以它们不会被调用 .

    如果你想绕过任何类逻辑并且只是使用Reflection从对象中获取/设置值,你应该以这种方式实例化水化器:

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

    然而,这在OOP世界中是一个可怕的想法 - 绕过逻辑,使用魔法 . 初学者倾向于创造这样的捷径 . 关于如何创建good, maintanable code的一些好的教程,因为我不打算在这里介绍这些主题 .

相关问题