当我运行doctrine orm:validate-schema
时,会弹出一堆关于我的映射列是公共的警告,而不是使用getter / setter方法来包装它们。它说他们“打破懒惰装载”。我可以理解如何使关联集合公开成为问题(我确实将它们设为私有并将它们包装起来),但这对于对象上的字段有什么问题?据我所知,字段已全部加载。
答案 0 :(得分:14)
虽然我当然不是Doctrine2专家,但我会对此有所帮助。
从我的(有限的)使用和测试来看,似乎Doctrine可能会为您提供一个相关对象而不加载该对象的数据。那时公共财产将打破延迟加载。
Doctrine是在请求持久化数据时延迟加载,而不是在请求包含持久数据的对象时。
更新:我看了actual proxy code,看来我原来的理解大多是正确的。在调用对象的方法之前,代理对象不会加载自身。因此,对公共财产的任何请求都不会加载数据。
答案 1 :(得分:9)
请注意,Doctrine 2.4现在supports proxy objects for entites with public properties。
Marco Pivetta的网站解释了how it works:
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)
}