Преимущества использования Doctrine для PHP? - PullRequest
9 голосов
/ 07 ноября 2010

Только что натолкнулся на проект Doctrine , в котором имеется объектно-реляционный картограф и слой абстракции БД.Что обеспечивает Doctrine, чего нет в других слоях абстракции PHP?И какое практическое применение вы можете использовать для ORM, помимо выборки объектов с помощью запросов, написанных на языке Doctrine Query Language?Является ли язык запросов действительно тем, что вы хотите разработать для всего веб-приложения?Работает ли он хорошо?

В целом, создание приложения на Doctrine облегчает поддержку и понимание?Является ли он чрезмерно спроектированным и целесообразно ли использовать уровень абстракции для проектов малого и среднего размера?(<50 экранов GUI), в отличие от непосредственной работы с MySQL. </p>

Ответы [ 3 ]

15 голосов
/ 07 ноября 2010

Что Doctrine обеспечивает, чего нет в других слоях абстракции PHP?

  1. Реализует шаблон DataMapper вместо ActiveRecord.
  2. Поддерживает аннотации , XML и YAML для схемы.
  3. Использует DQL .
  4. Использует преимущества PHP 5.3 +.
  5. Быстро и имеет большое сообщество.
  6. Кроме ORM есть ODM.

Является ли язык запросов действительно тем, что вы хотите разработать для всего веб-приложения?

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

В целом, создание приложения на Doctrine облегчает поддержку и понимание?

Определенно. Код легче читать, понимать и поддерживать.

Является ли он чрезмерно спроектированным и целесообразным для небольших и средних проектов?

На самом деле Доктрина довольно проста в своих основах. И это очень хороший выбор для небольших, средних и даже некоторых крупных приложений.


Доктрина - не ответ на все вопросы, и иногда она немного проблематична. Однако для типичных задач это чрезвычайно полезно. ИМХО лучший ORM / ODM для PHP на данный момент.

2 голосов
/ 21 августа 2014

Я хотел бы добавить несколько моментов к ответу Крозина, но, к сожалению, не могу это прокомментировать.Вот они:

  • Doctrine не использует магические методы __get () и __set () для доступа к атрибутам сущности, все атрибуты сущности должны иметь getter / setter.Это улучшает завершение кода IDE, и вам не нужно постоянно просматривать структуру таблицы БД.
  • Doctrine полностью абстрагирует вас от реальных имен полей таблицы.Как только вы сопоставили свойства сущности с полями БД - вы используете имена свойств везде.То же самое для имен таблиц.
  • Doctrine использует шаблон репозитория, который скрывает детали получения сущностей.
  • Doctrine использует подход «сначала код», поэтому вы можете сначала создать сущности, а затем автоматически сгенерировать для них базу данных,Возможен и обратный случай.
  • В Doctrine имеется мощный построитель запросов, поэтому вы можете использовать шаблон построителя для запросов с условными частями.
  • Doctrine использует внешние ключи и ограничения для выполнения каскадных действий и обеспечения согласованности данных.
  • UnitOfWork от Doctrine - довольно замечательная и умная штука, не имеющая аналогов в других php ORM

IMHO на данный момент doctrine обеспечивает лучшую поддержку завершения кода IDE и абстракцию уровня DB средивсе php ORMs доступны.Он не перегружен и соответствует твердым принципам.

0 голосов
/ 21 февраля 2018

Я хотел бы добавить пункт к ответу Геркирилл. Отсутствие поддержки магических методов получения / установки - слабость, ИМХО, а не сила. Если вы когда-либо просматривали десятки страниц идентичных методов получения / установки, вы поймете, что эти методы - огромная трата пространства (не говоря уже о времени компиляции). Никто случайно не устанавливает переменную объекта, и установщик не мешает вам сделать это ... когда вы хотите изменить свойство, вы просто вызываете установщик (как установщик "защищает" свойство - если вы Собираясь сделать опечатку и напрямую установить неправильное значение свойства, вы сделаете ту же опечатку и вызовете неправильный установщик). И это очень редко для установщика или получателя делать что-либо, кроме как получить или установить свойство. Если вам нужно сделать что-то особенное для установки или получения свойства, это свойство должно быть методом (см. http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html),, или вы должны рефакторинг своего кода, или вы должны вызывать функцию проверки свойства (обычно в то время объект создан.) Это один из тех бесспорных трюизмов, которые изводят мир ОО. Подумайте об этом, прежде чем публиковать стандартный ответ с полученной мудростью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...