【问题标题】:How to create magic geters and setters for doctrine ORM Entity in ZF2?如何在 ZF2 中为学说 ORM 实体创建魔法 getter 和 setter?
【发布时间】:2015-08-13 06:32:44
【问题描述】:

您好,我是 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

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

有什么解决方案可以让魔法 getter 和 setter 使用 zend 表单吗??

【问题讨论】:

    标签: doctrine-orm zend-framework2


    【解决方案1】:

    首先,这与 Zend Framework 2 无关。DoctrineObject hydrator 负责对对象进行水合。

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

    因为您传递了一个字符串,所以它的计算结果始终为 true,这指示 hydrator 实际使用 getter 和 setter 方法,并且由于此类方法不存在,因此它们不会被调用。

    如果您希望绕过任何类逻辑并仅使用反射从对象中获取/设置值,您应该以这种方式实例化水合器:

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

    然而,这在 OOP 世界中是一个糟糕的想法——绕过逻辑,使用魔法方法。初学者倾向于创建这样的捷径。请遵循一些关于如何创建 good, maintanable code 的优秀教程,因为我不打算在这里讨论这些主题。

    【讨论】:

    • Thnx @mike 我正在关注他们在第二个参数中传递字符串的教程,我认为这可能是类的名称空间......
    • 官方教程已经过时了:)
    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多