Когда я запустил doctrine orm:validate-schema
, он выдает кучу предупреждений о том, что мои сопоставленные столбцы являются общедоступными и не используют методы getter/setter, чтобы их обернуть. В нем говорится, что они «ломают ленивую загрузку». Я могу понять, как создавать связанные коллекции public может быть проблематичным (я делаю их приватными и обертываю их), но как это проблема для полей на объекте? Насколько мне известно, поля загружены полностью.Как публичные поля «ломают ленивую загрузку» в Доктрине 2?
ответ
Я сделаю снимок, хотя я, конечно, не эксперт Doctrine2.
Из моего (ограниченного) использования и тестирования кажется, что Доктрина может дать вам связанный объект без загрузки данных для этого объекта. В этот момент общественные объекты будут ломать ленивую загрузку.
Doctrine - это ленивая загрузка в том месте, где запрашиваются сохраненные данные, а не когда запрашивается объект, содержащий сохраненные данные.
Обновление: Я взглянул на actual proxy code, и, похоже, мое первоначальное понимание было в основном верным. Прокси-объект не загружается до тех пор, пока не будет вызван метод объекта. Таким образом, любой запрос к публичному ресурсу не будет загружать данные.
Да, это связано с тем, как вызываются прокси. –
Geez, это раздражает. Спасибо за ваши исследования. – ryeguy
@ryeguy Может быть, но кажется лучшим методом, чем некоторые альтернативы. Если вы выполняете ленивую загрузку при запросе сохраняемого объекта (вместо того, чтобы использовать *), ORH должна каким-то образом помещать код между свойством, содержащим связанный объект, и любым кодом, который может попытаться использовать это свойство (включая объект сам объект). Это сделало бы ленивую загрузку менее прозрачной. –
Обратите внимание, что 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 для презентации –
Так значит ли это, что мы можем игнорировать 'vendor/bin/doctrine orm: validate-schema' жалобы на публичные свойства? –
@ErikvanVelzen Я так думаю, я не знал, что этот инструмент жаловался на публичные свойства, возможно, вы должны подать вопрос о том, чтобы эта устаревшая функция была удалена! – Benjamin
- 1. как решить ленивую загрузку?
- 2. Отключить ленивую загрузку доктрины zend framework?
- 3. Doctrine 2: отключить ленивую загрузку/создание прокси.
- 4. как весна допускает ленивую загрузку?
- 5. Как реализовать ленивую загрузку битмапа?
- 6. Как эффективно выполнять более сложную Doctrine 2 ленивую загрузку?
- 7. Как запустить ленивую загрузку в навигационной собственности?
- 8. Поддерживает ли StatelessSession ленивую загрузку?
- 9. Публичные свойства или публичные поля?
- 10. Использует ли URLClassLoader ленивую загрузку?
- 11. Поддерживает ли NSFileWrapper ленивую загрузку?
- 12. SmartGWT TreeGrid отключить ленивую загрузку
- 13. JPA2/Hibernate - остановить ленивую загрузку?
- 14. Включить ленивую загрузку по запросу
- 15. Как реализовать ленивую загрузку с помощью SQLite?
- 16. Как реализовать ленивую загрузку GridView на WinRT?
- 17. Как сделать ленивую загрузку с помощью BXSlider
- 18. Как реализовать ленивую загрузку с помощью PostSharp?
- 19. Как использовать ленивую загрузку весной MVC
- 20. Как сделать ленивую загрузку скрипта с require.js?
- 21. Как автофлюировать в Доктрине 2?
- 22. Can ComboBox в AjaxToolkit использовать ленивую загрузку
- 23. FirstorDefault() вызывает ленивую загрузку или загрузку для linq в sql
- 24. Как обеспечить ленивую загрузку объектов на определенных условиях
- 25. Отключить всю ленивую загрузку или принудительную загрузку для контекста LINQ
- 26. Как обойти ленивую загрузку реактивных выражений в R Shiny?
- 27. Менее подробный способ сделать ленивую загрузку
- 28. Как сделать призрачные поля в Доктрине?
- 29. Включите ленивую загрузку для конкретного блока кода
- 30. Удаляет ли DDD и Automapper ленивую загрузку?
Честно говоря, я не мог поверить, что это либо, пока я не понял: Доктрина представляет собой библиотеку Java. Если они сосредоточились на максимально возможном использовании идиом PHP, а не навязывании вам «лучших практик», разработанных с учетом другого языка, возможно, производительность не была бы столь ужасной. Я согласен в принципе с аргументом для геттеров и сеттеров, но на интерпретируемом языке, где все, что они делают, является прокси-сервером в публичном поле, это бесполезная трата ресурсов. – Shabbyrobe
@Shabbyrobe: Спасибо. Вы в основном говорили, о чем я думал все это время. Доктрина - это в основном клон Спящего. Что нужно PHP, это нечто большее, чем клон Active Record. – ryeguy
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