PHP ORM: Доктрина против Propel

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

Большое спасибо.

EDIT: Спасибо за все ответы, полезные вещи. Там нет действительно правильного ответа на этот вопрос, поэтому я просто отмечу как одобренный тот, который получил самые популярные голоса.

Ответ 1

Я бы пошел с Доктриной. Мне кажется, что это гораздо более активный проект и являющийся стандартным ORM для Symfony, он лучше поддерживается (хотя официально ORM считаются равными).

Кроме того, мне больше нравится, как вы работаете с запросами (DQL вместо критериев):

<?php
// Propel
$c = new Criteria();
$c->add(ExamplePeer::ID, 20);
$items = ExamplePeer::doSelectJoinFoobar($c);

// Doctrine
$items = Doctrine_Query::create()
       ->from('Example e')
       ->leftJoin('e.Foobar')
       ->where('e.id = ?', 20)
       ->execute();
?>

(реализация Doctrine для меня намного интуитивна).

Кроме того, я действительно предпочитаю, как вы управляете отношениями в Doctrine.

Я думаю, что эта страница из документации Doctrine стоит прочитать: http://www.doctrine-project.org/documentation/manual/1_2/en/introduction:doctrine-explained

Подводя итог: если бы я начинал новый проект или должен был выбирать между учением "Учение и Propel", я бы каждый день ходил на Doctrine.

Ответ 2

Я смещен, так как немного помогу в следующем выпуске Propel, но вы должны подумать, что Propel действительно был первым доступным ORM, а затем немного отставал, когда Doctrine был создан, но теперь имеет активное развитие снова. Symfony 1.3/1.4 поставляется с Propel 1.4, где большинство сравнений останавливается на Propel 1.3. Кроме того, следующий выпуск Propel (1.5) будет содержать много улучшений, особенно при создании ваших критериев (в результате чего вам будет меньше кода для написания).

Мне нравится Propel, потому что он, кажется, менее сложный, чем Doctrine: большинство кода находятся в нескольких сгенерированных классах, тогда как Doctrine разделяет функциональность во многих классах. Мне нравится хорошо понимать библиотеки, которые я использую (не слишком много "магии" ), но, конечно, у меня больше опыта с Propel, поэтому, возможно, Doctrine не так сложна за кулисами. Некоторые говорят, что Propel работает быстрее, но вы должны проверить это для себя и подумать о том, что это перевешивает другие различия.

Возможно, вам стоит также рассмотреть возможность использования плагинов Symfony для разных фреймворков. Я считаю, что Propel имеет преимущество здесь, но я не знаю, сколько из перечисленных плагинов по-прежнему актуально с последней версией Symfony.

Ответ 3

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

Propel:

$person->setName('Derek');
echo $person->getName();

Доктрина:

$person->name = 'Derek';
echo $person->name;

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

Я также должен добавить, что хотя Propel был медленным в прошлом, он теперь активно развивается. За последние несколько месяцев он выпустил несколько новых версий. Самая последняя версия Propel включает "свободный интерфейс запросов", подобный Doctrine, поэтому вам больше не нужно использовать критерии, если вы этого не хотите.

Ответ 4

Следует отметить Doctrine 2 - это в настоящее время в разработке released [ed] и функции, почти полностью отличные от текущей стабильной версии Doctrine 1. Она опирается на шаблон Data Mapper вместо Active Record и использует "менеджер объектов" для обработки логики продолжительности. Когда он выпущен, он будет иметь более близкое сходство с Java Hibernate (Doctrine 1 больше похож на Rails ActiveRecord).

Я развиваюсь с альфа-выпуском Doctrine 2 и должен сказать, что это головы и плечи выше Doctrine 1 (просто мое мнение, и я никогда не использовал Propel). Скорее всего, сообщество доктрины будет двигаться к нему, когда оно будет выпущено.

Я бы посоветовал вам проверить Doctrine, но если вы предпочитаете стиль Active Record, который использует Propel и Doctrine, вы можете просто придерживаться Propel.

Ответ 5

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

http://propel.posterous.com/propel-141-is-out

Ответ 6

Я бы предложил использовать propel 1.6, который лучше подходит для функции автозаполнения IDE.

Ответ 8

Я бы предложил использовать DbFinder Plugin. На самом деле это очень мощный плагин, который поддерживает оба, и довольно неплохо мощный. Мне действительно нравится использовать его лучше, чем либо.

Ответ 9

Если я не ошибаюсь, оба ORM используют схему на основе XML, и создание этого определения схемы довольно громоздко. Если вам нужна простая схема на основе PHP с плавным стилем. Вы можете попробовать LazyRecord https://github.com/c9s/LazyRecord, он поддерживает автоматическую миграцию и обновление/понижение script генераторов. И все файлы классов генерируются статически без затрат времени исполнения.