Стоит ли выбирать Doctrine 2 или Propel 1.5 / 1.6 и почему? [закрыто]

30

Я хотел бы услышать от тех, кто использовал Doctrine 2 (или позже) и Propel 1.5 (или позже). Большинство сравнений между этими двумя объектными реляционными сопоставителями основаны на старых версиях - Doctrine 1 и Propel 1.3 / 1.4, и оба ORM претерпели значительные изменения в своих последних редакциях. Например, большая часть критики Propel, по-видимому, сосредоточена вокруг классов «ModelName Peer », которые в любом случае устарели в 1.5.

Вот что я накопил до сих пор (и я попытался сделать этот список максимально сбалансированным ...):

  • Propel
    • Pros
      • Чрезвычайно дружественный IDE, потому что фактический код генерируется, а не полагаться на магические методы PHP. Это означает, что такие функции IDE, как завершение кода , действительно полезны.
      • Быстро (с точки зрения использования базы данных - во время выполнения не выполняется самоанализ базы данных)
      • Чистая миграция между версиями схемы (по крайней мере, в бета-версии 1.6)
      • Может генерировать модели PHP 5.3 (то есть пространства имен)
      • Легко объединить множество вещей в один запрос к базе данных с помощью таких useXxxметодов, как методы. (См. Видео «Завершение кода» выше)
    • Cons
      • Требуется дополнительный шаг сборки, а именно построение классов моделей.
      • Сгенерированный код необходимо перестраивать всякий раз, когда изменяется версия Propel, изменяется настройка или изменяется схема. Для некоторых это может быть неочевидным, и пользовательские методы, применяемые к модели, теряются. (Думаю?) - не правда; пользовательские методы не теряются, потому что сгенерированный класс является базовым классом; Propel предоставляет класс сущностей специально для расширения.
      • Некоторые полезные функции (например, поведение версии, миграция схемы) находятся в бета-состоянии.
  • доктрина
    • Pros
      • Более популярным
      • Doctrine Query Language может выражать потенциально более сложные отношения между данными, чем это легко сделать с помощью стратегии Propel ActiveRecord.
      • Проще добавить многоразовое поведение по сравнению с Propel.
      • Комментирование на основе DocBlock для построения схемы встроено в реальный PHP, а не в отдельный XML-файл.
      • Повсеместно использует пространства имен PHP 5.3
    • Cons
      • Требуется изучение совершенно нового языка программирования (Doctrine Query Language)
      • Реализовано в терминах «магических методов» в нескольких местах, что делает автозаполнение IDE бесполезным.
      • Требует самоанализ базы данных и, следовательно, немного медленнее, чем Propel по умолчанию; кэширование может устранить это, но кэширование добавляет значительную сложность.
      • Меньше поведения включены в базовую кодовую базу. Несколько функций, которые Propel предоставляет «из коробки» (например, «Вложенный набор»), доступны только через расширения.
      • ОЧЕНЬ ОГРОМНОЕ :)

Это я почерпнул только благодаря чтению документации, доступной обоим инструментам - на самом деле я еще ничего не создал.

Я хотел бы услышать от тех, кто использовал оба инструмента, чтобы поделиться своим опытом о плюсах и минусах каждой библиотеки, и каковы их рекомендации на данный момент :)

Билли ОНил
источник
О какой версии Доктрины вы говорите? v2 и v1.2 являются полюсами друг от друга.
Orbling
1
@ Orbling: Вы читали заголовок или текст вопроса? Прочитайте их снова :)
Billy ONeal
@Billy ONeal: Хороший вопрос. В Doctrine2 поведение полностью удалено из ядра, так что я подумал, что вы, возможно, говорили о v1.2.
Orbling
@ Orbling: Ах, это имеет смысл. С другой стороны, он обеспечивает эквиваленты «поведениям» - он просто так их не называет.
Билли ОНил
@Billy ONeal: На самом деле это не так, вы можете реализовать их самостоятельно довольно простым способом или получить сторонние плагины. Но это не похоже на Doctrine1 или Propel.
Orbling

Ответы:

15

Несмотря на текущую тенденцию рекомендовать Доктрину, я должен сказать иначе. Имейте в виду, что мои личные предпочтения также ориентированы на мой личный опыт, но, как сказал @Dan, оба они очень сильны.

Мне не нравится Doctrine по нескольким причинам, которые вы указали ранее, например, размер и целые магические методы - вот что мешает мне заключить сделку . Итак, я использую Propel , почему? главным образом потому, что это просто, и потому что просто в разработке программного обеспечения - это хорошо . Мое личное убеждение в том, что жадность с дизайном это плохо.

Используя Propel, мне удалось реализовать реализацию шаблона репозитория для моих собственных систем, и она работает очень хорошо, не говоря уже о производительности Propel, который является одним из самых быстрых ORM, которые я видел.

Итак, мой основной ответ - Propel , потому что он позволяет создавать хорошее программное обеспечение с меньшим количеством кода и дает возможность IDE предоставлять вам хороший intellisense, не теряя смысла программного обеспечения ORM, которое подключается к базе данных и делает это хорошо ...

Надеюсь я смогу помочь

Дэвид Конде
источник
Я использовал Doctrine в течение года. Я пробовал Kohana, Laravel Eloquent, мне нравятся их открытые поля, потому что я действительно ненавижу геттеры и сеттеры (я предпочитаю метод доступа: P). После того, как я увидел слово «IDE friendly» в Propel, я решил попробовать Propel сегодня вечером.
Зорджи
11

Ваша информация о Доктрине 2 неверна ...

  • DQL - это в значительной степени SQL, так что не так много, чтобы учиться.
  • Doctrine 2 не использует никакой «магии» (только то, что вы ожидаете от любой современной библиотеки PHP).
  • Doctrine 2 активно не выполняет самоанализ базы данных ... отображение хранится в ваших файлах сущностей / отображений и предполагает, что ваша база данных подойдет для этого.
  • Кэширование вряд ли является «значительной сложностью».
  • Доктрина 2 не имеет «поведения» из коробки

Я не использовал Propel раньше, но Doctrine 2 намного новее и имеет действительно высококачественную кодовую базу. Но похоже, что Propel использует Active Record, Doctrine 2 использует шаблон Data Mapper.

Недостатком Doctrine 2 является отсутствие сторонних примеров, но он быстро накапливается.

Я рекомендую Доктрину 2 ...

коренастый
источник
Если вы не использовали Propel раньше, у меня нет выбора, кроме как понизить это из-за FUD. Что касается «магического» комментария, я имею в виду, что он основан на магических методах PHP, таких как __getи __set(что верно), а не на реальных методах.
Билли Онил
1
Хорошо, что за голосование против ... Но где Doctrine 2 использует магические методы? Помимо методов поиска * в DocumentRepository (__call), но это не проблема, потому что это просто более удобный способ запроса ... вы всегда потеряете автодополнение IDE. Если вы хотите ActiveRecord, используйте Propel. Если вы хотите Data Mapper, используйте Doctrine 2.
Cobby
2
Propel не анализирует базу данных во время выполнения благодаря генерации кода.
Уильям Дюран
Пункт № 1 пули не совсем корректен, DQL не очень похож на SQL. DQL зависит от того, что вы ссылаетесь на объекты модели, о которых должен знать Doctrine, и существуют некоторые сложности, если необходимы более сложные объединения.
Майк Перселл
2
DQL - это диалект SQL, как это не делает его "в значительной степени" похожим на SQL? Да, семантика языка немного отличается (объекты и таблицы), но, в конечном счете, DQL - это язык для запроса структурированных данных, которые просто оказались объектами, а не таблицами, или SQL.
Cobby
3

Судя по вашим комментариям, вы пытаетесь выбрать Propel или Doctrine для замены или удовлетворения ваших потребностей в ORM в унаследованном приложении.

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

Поэтому решение, которое вы выбираете, в значительной степени зависит от ваших предпочтений, основываясь на ваших ответах на следующие вопросы:

  1. Какой из них лучше всего интегрируется в ваше текущее решение?
  2. Какой API вы предпочитаете?
  3. Какой из них вы бы предпочли внести свой вклад? (патчи, документация, отчеты об ошибках и т.д ...)

Лично я бы порекомендовал Doctrine 2 из-за его сообщества, документации и архитектуры.

Кристофер Мэннинг
источник
1
Я ищу сравнение между ними здесь, хотя. (Почему какой из них я бы предпочел внести в дело? Я не хочу вносить вклад ни в один из них - я хочу использовать библиотеку, а не писать ее;;)). Вы говорите, что Doctrine 2 имеет хорошее сообщество, документы и архитектуру - с точки зрения архитектуры, да, это DataMapper. Документы мудрые, я не уверен, что согласен - оба проекта, кажется, имеют хорошие документы. Я не видел большую часть сообщества, использующего любую систему. Не могли бы вы уточнить, что вы подразумеваете под этими вещами?
Билли Онил
2
О, тебе нравится документ Доктрина? Вы читали Propel один? И да, сообщество Doctrine - это хорошо, но взгляните на репозиторий ODM, многие PR даже не комментируются, не объединяются и не отклоняются ... Посмотрите на график Propel, сообщество действительно активно;)
Уильям Дюран,
3

Я рекомендую вам Propel, потому что он хорошо интегрирован, быстрый и мощный. Генерировать код лучше, чем загружать классы во время выполнения, он облегчает этапы отладки и показывает, что вы создали. Таким образом, шаг сборки не является проблемой.

Doctrine2 не имеет официального поведения, а шаблон проектирования DataMapper - это круто, но его трудно использовать в реальной жизни. Да, и DQL - это боль, но язык для изучения еще хуже ...

Если вы хотите думать с объектами (без DQL / SQL / что угодно), выберите Propel.

Doctrine2 является частью Symfony2 де-факто, но все будет очень скоро, посмотрите последнюю статью Fabien Potencier.

Ура, Уильям

Уильям Дюран
источник
, я начал с Propel 2 года назад с symfony1. затем должен был переключиться на Doctrine2 для symfony2. Рад вернуться в Propel.Cheers!
Бхану Кришнан
2

Они оба очень хороши. Есть некоторые крайние случаи, когда один может сделать что-то или сделать что-то лучше, чем другой. Везде, где у меня возникали проблемы, это было связано скорее с недостатком знаний, чем с тем, что они не могли сделать.

Это означает, что документация и поддержка важнее внутренних возможностей кода. Знаете ли вы кого-нибудь, кто может помочь вам, когда вы столкнетесь с проблемами? Насколько хорошо вы справляетесь с документацией? Кто-то из них просто чувствует себя более естественно для вас?

Дэн Блоуз
источник
2

Я выбрал Propel 1.63 для большого унаследованного приложения mysql (200 таблиц или около того) - здесь учитывались следующие факторы: поддержка IDE, позволяющая новым разработчикам легко находить свой путь с дополнением кода; поддержка кросс-схем, производительность; лучшая встроенная поддержка перечислений и использование нескольких поведений. На самом деле я начал с Doctrine, так как он был лучше всего поддержан Symfony2, но как только Propel значительно улучшил их поддержку с Symfony (следующая платформа, на которую я в конечном итоге перейду), я переключился из-за лучшей обработки вышеуказанных проблем. Никаких сожалений. Propel - решающий победитель.

Майкл Хьюард
источник