PHP ORMs: доктрина против пропела
Я начинаю новый проект с в Symfony, которая легко интегрируется с доктрина и Propel, но мне, конечно, нужно сделать выбор.... Мне было интересно, есть ли у более опытных людей общие плюсы и/или минусы для того, чтобы пойти с любым из этих двух?
Спасибо большое.
EDIT: Спасибо за все ответы, полезные вещи. На этот вопрос нет правильного ответа, поэтому я просто Марк как одобрил тот,который получил самые популярные голоса.
10 ответов
Я бы пошел с учением. Мне кажется, что это гораздо более активный проект и, будучи ORM по умолчанию для symfony, он лучше поддерживается (хотя официально ORMs считаются равными).
кроме того, мне больше нравится, как вы работаете с запросами (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();
?>
(реализация доктрины гораздо более интуитивна для меня).
кроме того, я действительно предпочитаю, как вы управляете отношениями в доктрине.
Я думаю, что это страница из документации доктрины стоит прочитать: http://www.doctrine-project.org/documentation/manual/1_2/en/introduction:doctrine-explained
я предвзят, так как я немного помогаю в следующем выпуске Propel, но вы должны учитывать, что Propel действительно был первым доступным ORM, затем немного отставал, когда доктрина была создана, но теперь снова имеет активное развитие. Symfony 1.3 / 1.4 поставляется с Propel 1.4, где большинство сравнений останавливаются на Propel 1.3. Кроме того, Следующий выпуск Propel (1.5) будет содержать много улучшений, особенно в создании критериев для вас (что приведет к меньшему количеству кода для вас).
I как и Propel, потому что он кажется менее сложным, чем Doctrine: большинство кода находится в нескольких сгенерированных классах, тогда как Doctrine разделил функциональность на множество классов. Мне нравится иметь хорошее представление о библиотеках, которые я использую (не слишком много "магии"), но, конечно, у меня больше опыта работы с Propel, поэтому, возможно, доктрина не так сложна за кулисами. Некоторые говорят, что Propel быстрее, но вы должны проверить это для себя и рассмотреть, перевешивает ли это других различия.
возможно, Вам также следует рассмотреть доступность плагинов Symfony для разных фреймворков. Я считаю, что Propel имеет преимущество здесь, но я не знаю, сколько из перечисленных плагинов все еще актуальны с последней версией Symfony.
это сводится к личным предпочтениям. Я использую Propel, потому что (среди прочего) мне нравится тот факт, что все имеет свой собственный конкретный метод getter & setter. В доктрине это не так.
Propel:
$person->setName('Derek');
echo $person->getName();
доктрина:
$person->name = 'Derek';
echo $person->name;
причина, по которой мне нравится иметь геттеры и сеттеры, заключается в том, что я могу поместить в них все виды логики, если мне нужно. Но это мое личное предпочтение.
Я также должен добавить, что, хотя Propel был медленно двигаясь в прошлом, сейчас он снова находится в активном развитии. За последние несколько месяцев было выпущено несколько новых версий. Самая последняя версия Propel включает в себя в "свободный запрос" интерфейс похож на доктрины, поэтому вам больше не нужно использовать критерии, если вы не хотите.
стоит отметить доктрина 2 и В настоящее время в развитии освобожден [ed] и функции почти полностью отличаются от текущей стабильной версии доктрины 1. Он полагается на шаблон сопоставления данных вместо активной записи и использует "диспетчер сущностей" для обработки логики сохранения. Когда он будет выпущен, он будет иметь более близкое сходство с гибернацией Java (доктрина 1 больше похожа на ActiveRecord Rails).
Я развивается с Альфа-выпуском доктрины 2, и должен сказать, что это головы и плечи выше доктрины 1 (только мое мнение, и я никогда не использовал Propel). Есть хорошие шансы, что сообщество доктрин будет двигаться к нему, когда оно будет выпущено.
Я бы рекомендовал вам проверить доктрину, но если вы предпочитаете активный стиль записи, который сейчас использует Propel и Doctrine, вы можете просто придерживаться Propel.
две ссылки несколько устарели, поэтому вы, тем не менее, охватываете некоторые обобщения, в основном вам нужно будет оценить свой опыт работы с платформой как таковой, основным недостатком доктрины является невозможность иметь IDE, которая позволяет вам автоматически кодировать, что propel является победителем, кривые обучения propel и доктрина очень разные, легче продвигать, если ваш проект должен будет управлять сложной моделью данных использует доктрину, если вы хотите быстро работать с ORM, который лучше всего документировано и найти больше поддержки в Propel интернет использует, гораздо более зрелым, и я считаю, что наиболее часто используется.
Я не пользователь PHP 5 non-framework ORM, но вот некоторые хорошие сообщения сравнения (если вы их еще не видели):
http://codeutopia.net/blog/2009/05/16/doctrine-vs-propel-2009-update/
http://trac.symfony-project.org/wiki/ComparingPropelAndDoctrine
оба конуса фаворита к доктрине как новое поколение ORM для Symfony.
Я бы предложил использовать Плагин DbFinder. Это на самом деле очень мощный плагин, который поддерживает обе, и довольно хороший. Мне нравится использовать его лучше, чем кто-либо.
после использования обоих из них в течение нескольких лет я предпочитаю Propel 2 доктрине просто на основе того, как вы строите логику запроса. Доктрина настолько глубока, насколько она может получить, и управление многими ее аспектами соответствует этому уровню глубины. Propel я чувствую, имеет более жидкий и объектно-управляемый Способ построения и управления взаимодействиями запросов.
для меня это привело к меньшему коду в модели и большему количеству структур вокруг того, как логика может/будет обработана. Это вылилось в строительство много взаимодействий как общая функциональность. (В конце концов, 90% того, что вы будете делать с базой данных, будет просто некоторой степенью работы crud.)
в конце концов, оба являются мощными, управляемыми и выполнят свою работу. Мои личные проекты и интересы используют Propel ORM 2 и будущие проекты, если они все еще написаны на PHP, пойдут по этому пути.
Я использую на ежедневной основе в течение последних 3-4 лет.
Если я не ошибаюсь, оба ORMs используют схему на основе XML, и создание этого определения схемы довольно громоздко. Если вам нужна простая схема на основе PHP с плавным стилем. Вы можете попробовать LazyRecord https://github.com/c9s/LazyRecord он поддерживает автоматическую миграцию и обновление/генераторы сценариев понижения. И все файлы классов генерируются статически без затрат времени выполнения.