当我运行
doctrine orm:validate-schema
时,它会弹出一堆警告,提示我的映射列是公共的,并且没有使用 getter/setter 方法来包装它们。它说它们“破坏了延迟加载”。我可以理解如何将关联集合公开可能会出现问题(我确实将它们设为私有并包装它们),但是对于对象上的字段来说,这怎么会是一个问题呢?据我所知,字段已完整加载。
我会尝试一下,尽管我肯定不是 Doctrine2 专家。
从我(有限的)使用和测试看来,Doctrine 可能会为您提供一个相关对象而无需加载该对象的数据。那时公共属性将打破延迟加载。
Doctrine 在请求持久数据时延迟加载,而不是在请求包含持久数据的对象时延迟加载。
更新:我查看了实际代理代码,看来我原来的理解大部分是正确的。在调用该对象的方法之前,代理对象不会自行加载。因此,对公共属性的任何请求都不会加载数据。
请注意,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)
}