10

当我运行时doctrine orm:validate-schema,它会弹出一堆关于我的映射列是公开的并且没有使用 getter/setter 方法来包装它们的警告。它说他们“打破延迟加载”。我可以理解如何将关联的集合设为公开可能会出现问题(我确实将它们设为私有并包装它们),但这对于对象上的字段来说是个问题吗?据我所知,字段已满载。

4

2 回答 2

14

尽管我当然不是 Doctrine2 专家,但我会对此进行尝试。

从我的(有限的)使用和测试看来,Doctrine 可能会在不加载该对象的数据的情况下为您提供相关的对象。那时公共属性将打破延迟加载。

Doctrine 在请求持久化数据时延迟加载,而不是在请求包含持久化数据的对象时。

更新:我查看了实际的代理代码,看来我最初的理解大部分是正确的。在调用对象的方法之前,代理对象不会加载自己。因此,对公共财产的任何请求都不会加载数据。

于 2010-11-03T19:04:50.297 回答
9

请注意,Doctrine 2.4 现在支持具有公共属性的实体的代理对象

Marco Pivetta的网站解释了它是如何工作的:

class Customer {
    public $name;
    public $surname;
}

class CustomerProxy extends Customer {
    public function __construct(Customer $customer) {
        unset($this->name, $this->surname);
        $this->customer = $customer;
    }
    public function __set($name, $value) {
        $this->customer->$name = $value;
    }

    public function __get($name) {
        return $this->customer->$name;
    }
    // __isset, __unset, __clone, __sleep, __wakeup (or serialize/unserialize)
}
于 2013-09-17T08:48:22.277 回答