2010-01-14 12 views
121

Ich beginne ein neues Projekt mit symfony, die leicht mit Doctrine und Propel integriert ist, aber ich muss natürlich eine Wahl treffen .... Ich fragte mich, ob mehr erfahrene Leute da draußen Haben Sie allgemeine Vorteile und/oder Nachteile, um mit einem dieser beiden zu gehen?PHP ORMs: Doctrine vs. Propel

Vielen Dank.

EDIT: Vielen Dank für die Antworten, nützliche Dinge. Es gibt keine wirklich richtige Antwort auf diese Frage, deshalb werde ich nur die mit den beliebtesten Stimmen als genehmigt markieren.

+4

Leute, gibt es aktualisierte Antworten? Sehen Sie, dass dieser veraltete Weg –

Antwort

72

würde ich mit Lehre gehen. Es scheint mir, dass es ein viel aktiveres Projekt ist und als Standard-ORM für Symfony besser unterstützt wird (obwohl die ORMs offiziell als gleichwertig betrachtet werden).

Der Weiter ich besser die Art, wie Sie mit Abfragen (anstelle von Kriterien DQL) arbeiten:

<?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(); 
?> 

(Lehre der Umsetzung ist viel intuitiver zu mir).

Auch bevorzuge ich die Art, wie Sie Beziehungen in Doctrine verwalten.

Ich denke, diese Seite aus dem Buch Lehre Dokumentation wert ist ein Lese: http://www.doctrine-project.org/documentation/manual/1_2/en/introduction:doctrine-explained

Fazit: Wenn ich ein neues Projekt beginnen waren oder zwischen Lernen Lehre und Propel wählen ich für Lehre jeden Tag gehen würde .

+40

In Propel 1.5 kann diese Abfrage auch als Example_Query :: create() -> joinWith ('FooBar') -> filterId (20) -> find() (oder findPK (20) nach dem JoinWith geschrieben werden, wenn Id Ihre ist Primärschlüssel). Wie Sie sehen können, braucht es die schöne Syntax von Doctrine und fügt ein bisschen mehr hinzu. Die Veröffentlichung ist für Ende des ersten Quartals 2010 geplant, aber Sie können sie jetzt in Ihren Symfony-Projekten testen. –

+0

Netter Beitrag, ich wusste nicht, dass :-) – phidah

+8

Doktrin-Implementierung viel komplexer zu mir scheint. Get Entity Manage get Repository ... das und das –

2

Ich bin kein Benutzer von PHP 5 nicht-Framework ORM, aber hier ist ein paar guten Vergleich Beiträge (falls Sie sie noch nicht gesehen):

http://codeutopia.net/blog/2009/05/16/doctrine-vs-propel-2009-update/

http://trac.symfony-project.org/wiki/ComparingPropelAndDoctrine

Beide Conclusion Favorit gegenüber Doctrine als eine neuere Generation von ORM für Symfony.

+0

Für den Rekord ist dieser Vergleich völlig veraltet - aktuelle Version von Propel verwendet PDO, verwendet Unterstützung viele-zu-viele-Beziehungen und hat eine großartige Dokumentation.Auch eine Überlegung wert: Einige von uns bevorzugen den ausführlichen Kriterien-Builder-Query-Stil über proprietäre Abfragesprachen wie DQL - es hat IDE-Unterstützung und es ist eine Klasse, so dass Sie es erweitern können. Ich versuche immer noch zu wählen, aber ich sehe eine Menge Vorteile für Propel über Doctrine, wenn es Ihnen nichts ausmacht, statische Code-Generierung und die Vorteile von "echtem" PHP-Code im Gegensatz zu proprietärer Abfragesprache zu sehen , das sind nur Strings für eine IDE. –

5

Die beiden Referenzen sind etwas veraltet, so dass Sie dennoch einige allgemeine Aspekte abdecken, im Grunde müssten Sie Ihre Erfahrung mit dem Framework als solche bewerten, ein großer Nachteil der Lehre ist die Unfähigkeit, eine IDE zu haben, die Sie Auto-Code in diesem Antrieb ist ein Gewinner, Lernkurven Antrieb und Lehre sind sehr unterschiedlich, es ist einfacher zu treiben, wenn Ihr Projekt komplexe Datenmodell verwendet Lehre verwalten muss, wenn Sie schnell mit einem ORM arbeiten wollen, die am besten dokumentiert und zu finden ist mehr Unterstützung in Propel Internet verwendet, ist viel reifer und ich glaube, dass am meisten verwendet.

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

+0

In der symfony Welt scheint Doctrine am meisten benutzt zu sein - besonders für neuere Projekte. Es gibt natürlich eine Menge sf 1.0-Projekte, die noch Propel verwenden, da Doctrine für Symfony erst ab 1.1 verfügbar war. – phidah

39

Ich bin voreingenommen, da ich ein wenig auf die nächste Version von Propel helfe, aber Sie müssen bedenken, dass Propel in der Tat die erste ORM zur Verfügung stand, dann ein bisschen zurückgeblieben, als Doctrine erstellt wurde, aber jetzt wieder aktive Entwicklung hat. Symfony 1.3/1.4 kommt mit Propel 1.4, wo die meisten Vergleiche bei Propel 1.3 aufhören. Außerdem wird die nächste Version von Propel (1.5) eine Menge Verbesserungen enthalten, besonders bei der Erstellung Ihrer Kriterien (was zu weniger Code für Sie zum Schreiben führt).

Ich mag Propel, weil es weniger komplex zu sein scheint als Doctrine: Der meiste Code ist in den wenigen generierten Klassen enthalten, während Doctrine die Funktionalität in viele Klassen aufgeteilt hat.Ich mag ein gutes Verständnis der Bibliotheken, die ich benutze (nicht zu viel "Magie"), aber natürlich habe ich mehr Erfahrung mit Propel, also ist Doktrine vielleicht nicht so kompliziert hinter den Kulissen. Einige sagen, Propel ist schneller, aber Sie sollten dies selbst überprüfen und überlegen, ob dies andere Unterschiede überwiegt.

Vielleicht sollten Sie auch die Verfügbarkeit von Symfony Plugins für die verschiedenen Frameworks berücksichtigen. Ich glaube, Propel hat hier einen Vorteil, aber ich weiß nicht, wie viele der aufgelisteten Plugins immer noch mit der neuesten Version von Symfony auf dem neuesten Stand sind.

+4

Die neuen Abfrage Verbesserungen in Propel 1.5 sind wirklich nett in der Tat. – Tom

21

Es kommt auf persönliche Vorlieben. Ich benutze Propel, weil (unter anderem) ich mag die Tatsache, dass alles seinen eigenen Beton Getter & Setter-Methode hat. In der Lehre ist dies nicht der Fall.

Propel:

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

Lehre:

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

Der Grund, warum ich mag es, Getter & Setter ist, dass ich in ihnen alle Arten von Logik setzen, wenn ich muss. Aber das ist nur meine persönliche Vorliebe.

Ich sollte auch hinzufügen, dass, obwohl Propel in der Vergangenheit langsam bewegte, ist es jetzt wieder aktiv Entwicklung. Es hat in den letzten Monaten mehrere neue Versionen veröffentlicht. Die neueste Version von Propel enthält eine "fließende Abfrage-Schnittstelle" ähnlich Doctrine, so dass Sie Criteria nicht mehr verwenden müssen, wenn Sie nicht möchten.

+7

in Doctrine können Sie Setter und Getter für jede Eigenschaft außer Kraft setzen und haben auch benutzerdefinierte Logik (siehe http://www.doctrine-project.org/documentation/manual/1_2/en/introduction-to-models - Suche nach ATTR_AUTO_ACCESSOR_OVERRIDE zu bekommen zum entsprechenden Abschnitt) –

+0

Das sieht gut aus, aber Sie setzen die Eigenschaft immer noch durch Aufruf von: $ x-> propname = 'abc'; Dies ist problematisch, da es scheinbar nicht die Übergabe mehrerer Parameter unterstützt. –

20

Es soll Doctrine 2 ist derzeit released [ed] und Funktionen fast völlig verschieden von der aktuellen stabilen Version von Lehre 1. Es beruht auf der Data Mapper Mustern anstelle von Active Record in der Entwicklung festgestellt werden, und verwendet eine 'Entity Manager' zur Handhabung der Persistenzlogik. Nach der Veröffentlichung wird es dem Java Hibernate ähnlicher sein (Doctrine 1 ist mehr wie Rails ActiveRecord).

Ich habe mit der Alpha-Version von Doctrine 2 entwickelt und muss sagen, es ist Kopf und Schultern über Lehre 1 (nur meine Meinung, und ich habe noch nie Propel verwendet). Die Chancen stehen gut, dass die Doctrine-Community bei der Veröffentlichung darauf zugreift.

Ich würde Sie ermutigen, Doctrine auszuprobieren, aber wenn Sie den Active Record-Stil bevorzugen, den Propel und Doctrine jetzt verwenden, möchten Sie vielleicht nur bei Propel bleiben.

+0

wow ... danke für die Einsicht. – Tom

+4

Eine stabile Version von Doctrine 2 wurde kürzlich veröffentlicht. http://www.doctrine-project.org/blog/doctrine2-released –

1

Ich würde vorschlagen, DbFinder Plugin zu verwenden. Dies ist eigentlich ein sehr leistungsfähiges Plugin, das beides unterstützt, und ist ziemlich nett. Ich mag es eigentlich besser als beide.

+0

@Mike: Danke, wusste nicht über das Plugin, aber es scheint nur unterstützt bis zu Sf1.2. Ich bin am Ende mit Doktrine gegangen, es fühlt sich an, als wäre es die richtige Wahl, obwohl das Schreiben von direktem SQL für die komplexeren Dinge nötig ist. – Tom

4

Ich würde vorschlagen, proprive 1.6 zu verwenden, das besser für die Autovervollständigungsfunktion von IDE ist.

+24

-1 Autovervollständigung einer IDE sollte nicht der Grund einer technischen Entscheidung sein –

+12

@ClementHerreman Ich stimme zu, es sollte nicht _the_ Kriterien sein, aber ich glaube, wie produktiv man mit einer bestimmten Technologie sein kann, sollte sicherlich ein Grund sein, es zu wählen . Und mit allem gebührenden Respekt stimme ich daher nicht mit Ihrem Downvote überein ... Unabhängig davon, ob Sie der Antwort zustimmen, es ist nicht "falsch" (oder ist es?), Und es ist von Nutzen (es sei denn, es ist falsch, in welchem ​​Fall , das solltest du sagen). – Sepster

+2

IMO Wenn Ihre Produktivität durch Autovervollständigung verbessert wird, anstatt durch Softwarequalität, Intuitivität und Konsistenz, dann passiert etwas Seltsames. Siehe http://www.codinghorror.com/blog/2009/01/the-sad-tragedy-of-micro-optimization-theater.html. Aber du hast Recht, irgendwann ist diese Antwort nicht falsch, einfach nicht gut genug, vielleicht sogar nicht gut. –

-2

Wenn ich nicht falsch liege, verwenden beide ORMs ein XML-basiertes Schema, und das Erstellen dieser Schemadefinition ist ziemlich umständlich. Wenn Sie ein PHP-basiertes einfaches Schema mit fließendem Stil benötigen. Sie können versuchen LazyRecord https://github.com/c9s/LazyRecord es unterstützt automatische Migration und Upgrade/Downgrade-Skript-Generatoren. Und alle Klassen-Dateien werden statisch ohne Laufzeitkosten generiert.