Как публичные поля могут «прервать ленивую загрузку» в Doctrine 2? - PullRequest
10 голосов
/ 03 ноября 2010

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

Ответы [ 2 ]

14 голосов
/ 03 ноября 2010

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

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

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

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

9 голосов
/ 17 сентября 2013

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

Сайт Марко Пиветты объясняет , как это работает :

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)
}
...