Как публичные поля «ломают ленивую загрузку» в Доктрине 2?

Когда я запускаю doctrine orm:validate-schema , он выдает кучу предупреждений о том, что мои сопоставленные столбцы являются общедоступными, а не используют методы getter / setter для их переноса. В нем говорится, что они «ломают ленивую загрузку». Я могу понять, как создание связанных коллекций общественности может быть проблематичным (я делаю их приватными и обертываю их), но как это проблема для полей на объекте? Насколько мне известно, поля загружены полностью.

Я сделаю это, хотя я, конечно, не эксперт Doctrine2.

Из моего (ограниченного) использования и тестирования кажется, что Doctrine может дать вам связанный объект без загрузки данных для этого объекта . В этот момент общественные объекты будут ломать ленивую загрузку.

Доктрина – это ленивая загрузка в том месте, где запрашиваются сохраненные данные, а не когда запрашивается объект, содержащий сохраненные данные.

Обновление: я взглянул на фактический прокси-код, и, похоже, мое первоначальное понимание было в основном правильным. Прокси-объект не загружается до тех пор, пока не будет вызван метод объекта. Таким образом, любой запрос к публичному ресурсу не будет загружать данные.

Обратите внимание, что Doctrine 2.4 теперь поддерживает прокси-объекты для entites с общедоступными свойствами .

На веб-сайте 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) }