2010-11-03 3 views
10

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

+5

Честно говоря, я не мог поверить, что это либо, пока я не понял: Доктрина представляет собой библиотеку Java. Если они сосредоточились на максимально возможном использовании идиом PHP, а не навязывании вам «лучших практик», разработанных с учетом другого языка, возможно, производительность не была бы столь ужасной. Я согласен в принципе с аргументом для геттеров и сеттеров, но на интерпретируемом языке, где все, что они делают, является прокси-сервером в публичном поле, это бесполезная трата ресурсов. – Shabbyrobe

+2

@Shabbyrobe: Спасибо. Вы в основном говорили, о чем я думал все это время. Доктрина - это в основном клон Спящего. Что нужно PHP, это нечто большее, чем клон Active Record. – ryeguy

+8

Doctrine 2 и Hibernate являются реализациями схемы агностического отображения данных платформы, но я считаю, что метод Doctrine 2 реализовал его, используя слишком много идиом Java, таких как «геттеры и сеттеры для абсолютно всех, без вопросов». PHP - интерпретируемый язык - зачем добавлять методы, которые практически ничего не делают, если они оказывают измеримое негативное влияние на производительность? Я изложил некоторые из моих аргументов против позиции «getters and setters for all» [здесь] (http://stackoverflow.com/questions/808348/is-it-really-that-wrong-not-using-setters- и-добытчики/813099 # 813099). – Shabbyrobe

ответ

13

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

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

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

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

+0

Да, это связано с тем, как вызываются прокси. –

+1

Geez, это раздражает. Спасибо за ваши исследования. – ryeguy

+1

@ryeguy Может быть, но кажется лучшим методом, чем некоторые альтернативы. Если вы выполняете ленивую загрузку при запросе сохраняемого объекта (вместо того, чтобы использовать *), ORH должна каким-то образом помещать код между свойством, содержащим связанный объект, и любым кодом, который может попытаться использовать это свойство (включая объект сам объект). Это сделало бы ленивую загрузку менее прозрачной. –

9

Обратите внимание, что Doctrine 2.4 теперь supports proxy objects for entites with public properties.

Marco Pivetta «s сайт объясняет 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) 
} 
+1

+1 для презентации –

+1

Так значит ли это, что мы можем игнорировать 'vendor/bin/doctrine orm: validate-schema' жалобы на публичные свойства? –

+0

@ErikvanVelzen Я так думаю, я не знал, что этот инструмент жаловался на публичные свойства, возможно, вы должны подать вопрос о том, чтобы эта устаревшая функция была удалена! – Benjamin

Смежные вопросы