Sep 02

Heute morgen haben die Entwickler von Doctrine einen ersten Preview Release des neuen Doctrine 2 veröffentlicht. Genau ein Jahr, nachdem Doctrine 1 stable wurde, geht also Doctrine 2 seinen ersten Weg an die Öffentlichkeit. Btw. Herzlichen Glückwunsch zum Geburtstag, Doctrine 1 :) .

Bei Doctrine 2 handelt es sich um einen kompletten Redesign des Codes und der Infrastruktur. 90% des Codes wurden neu geschrieben und in neue Konzepte gepresst. Das neue Doctrine 2 ist in Pakete aufgeteilt, die aber höchst wahrscheinlich bei den meisten im Paket verwendet werden:

  • Doctrine Common (Generic components, high re usability)
  • Doctrine DBAL (The database abstraction layer, includes: Common)
  • Doctrine ORM (The ORM tools, includes: Common + DBAL)

Die Pakete können separat runtergeladen werden, und werden im Moment (noch) gleichzeitig released und maintained, dies kann sich aber wohl in Zukunft ändern.

Einige Tools von Doctrine 1 (z.B. das CLI oder die Migrations) befinden sich noch in der Entwicklung und werden ggf. später im Extension Repository landen und nicht mehr im Core enthalten sein, das ist aber aktuell noch nicht geklärt.

Generell sei zu sagen, dass dieser Release nicht für die Produktion gedacht ist, sondern für die Community als ersten Test, um ein wenig mit dem neuen Core warm zu werden. Ein Quickstart Tutorial wurde hier veröffentlicht. Der Download ist hier zu finden, Bugs können – wie immer – im Trac gemeldet werden.

Post to Twitter Post to Delicious Post to Digg Post to Facebook

written by Alexander \\ tags: , , , ,

Feb 14

Doctrine wächst und gedeiht, so war es heute im offiziellen Entwickler-Blog zu lesen. Der nächste Release für die 0.9er Branch wird nun wohl auch der letzte sein (0.9.1). Gleichzeitig wird es auch einen neuen Release der 0.10er Branch geben, welche dann auch weiterhin unterstützt wird. Soll heißen für die 0.9.x Branch wird es keine Bugfixes mehr geben. Der Trunk bleibt weiterhin für den Produktiveinsatz nicht empfohlen, da hier Refactoring und die Entwicklung von neuen Features betrieben wird. Wenn man mal einen Einblick haben will, was gerade implementiert wird oder ein neues Feature ausprobieren will, kann man aber gerne damit rumspielen.

Weiterhin fiebert man im Hause Doctrine bereits dem Release von PHP 5.3 entgegen, da man danach die Klassen-Infrastruktur von Doctrine auf Namespaces umstellt und somit eine weitere Modularisierung erreicht.

Ich habe leider im Moment keine Gelegenheit eine der aktiven Branches produktiv zu verwenden, werde aber wahrscheinlich in naher Zukunft wieder Gelegenheit haben mit einer neueren Version zu arbeiten. Ich kann allerdings auch sagen, dass die älteren Versionen auch im Produktivbetrieb doch schon recht stabil sind (so man sie dann mal ans Laufen bekommen hat) ;) .

Für interessierte Leser kann ich auch die diversen Mailinglisten empfehlen. Hier wird munter über die Weiterentwicklung, Refactoring und Probleme diskutiert. Ich halte weiterhin an Doctrine fest, es ist ein wirklich tolles Tool wenn man objektorientiert Programmieren will und sein Datenmodell über einen ORM-Layer abstrahieren will. Man sollte trotzdem bedenken, dass eine solche Struktur nicht gerade für schwache Live-Maschinen gedacht ist – ich gehe hier von einem High-Traffic-Projekt aus. Für das Blog um die Ecke oder die Webvisitenkarte sollte ein normales Web-Paket durchaus ausreichen ;) . Beziehen kann man Doctrine aus dem offiziellen SVN Repository.

Post to Twitter Post to Delicious Post to Digg Post to Facebook

written by Alexander \\ tags: , , , , , ,

Jan 31

Wer mit Doctrine arbeitet, der vermisst es ab und an, die Datenbankmanagement-System spezifischen SQL-Funktionen verwenden zu können, da diese nativ vom Doctrine-Query-Parser angemeckert werden, da sie nicht zum SQL-Standard gehören.

Jetzt hatte ich wieder den Fall, dass ich einen simplen Select hatte, in dem ich entscheiden mußte, ob ich das Datum der Einstellung oder das Datum der Aktualisierung des Datensatzes zum Sortieren benutze. Das verlangt einen Vergleich im Query, den man in SQL folgendermaßen abfangen kann:

1
SELECT i.*, IF(i.date_created > i.date_updated, i.date_created , date_updated) AS date_compare FROM item AS i ORDER BY date_compare

Das in einen Doctrine-Query gepackt sieht so aus:

1
2
3
4
5
$Query = new Doctrine_Query;
$Query->select ( 'i.*, IF(i.date_created > i.date_updated, i.date_created , date_updated) as date_compare' );
$Query->from ( 'Db_Item i' );
$Query->orderBy ( 'date_compare' );
$Result = $Query->execute(array(),Doctrine::FETCH_ARRAY);

Das so ausgeführt wirft eine Exception, weil Doctrine mit dem Funktionsaufruf IF nicht zurecht kommt, da sie nicht zum Standard gehört. Jetzt habe ich bisher immer einen Workarround gefunden, doch diesmal wollte ich mich damit nicht abgeben. Nach einiger Recherche kam ich auf ein Blog, welches sich um sfDoctrine dreht (das Symfony Plugin basierend auf Doctrine). Hier ist genau dieses Problem beschrieben und es wird eine Option beschrieben, mit der man beeinflussen kann, wie sehr der Doctrine Parser auf Kompatibilität zu anderen DBMS achtet.

Folgendes Beispiel funktioniert wie gewollt:

1
2
3
4
5
6
7
Doctrine_Manager::getInstance()
->setAttribute(Doctrine::ATTR_PORTABILITY, Doctrine::PORTABILITY_ALL ^ Doctrine::PORTABILITY_EXPR); 
$Query = new Doctrine_Query;
$Query->select ( 'i.*, IF(i.date_created > i.date_updated, i.date_created , date_updated) as date_compare' );
$Query->from ( 'Db_Item i' );
$Query->orderBy ( 'date_compare' );
$Result = $Query->execute(array(),Doctrine::FETCH_ARRAY);

Man kann also die Portability über das Entfernen des Flags PORTABILITY_EXPR beeinflussen und damit verlangen, dass der Doctrine-Query-Parser auf solche Dinge nicht mehr achtet. Da lohnt sich vielleicht sogar der Blick in den Source bzw. die Api-Doku, vielleicht finden sich ja noch mehr solche Einstellungen ;) .

Ich hoffe anderen damit helfen zu können, wie mir der Blog-Eintrag Symforc geholfen hat ;) .

Post to Twitter Post to Delicious Post to Digg Post to Facebook

written by Alexander \\ tags: , , , , , , ,

Nov 13

Nachdem ich vor einer Weile berichtet hatte, dass der erste Release Candidate von Doctrine veröffentlicht wurde, habe ich heute nach einer Weile nochmal ins Blog der Entwickler gesehen und gelesen, dass sie mit dem Verkünden des RC1 wohl etwas voreilig waren. Ich nehme mal an sie meinen den 30. November. Sie haben nun kurzerhand aus dem RC1 ein Beta1 gemacht und haben sich damit selbst wieder die Möglichkeit gegeben – ohne großes Trara – Api-Änderungen zu machen, die die Rückwärtskompatibilität zerstören. Eine Beta2 ist für den 31. November angekündigt – ja, das steht da so ;) .

Just heute mußte ich feststellen, dass die Rückwärtskompatibilität schon gelitten hat, denn nach einem Update auf die neuste Revision funktionierte die Anwendung nicht mehr. Ich habe es mir erstmal gespart das zu debuggen und die alte Version zurückgespielt und hebe mir diesen Spaß mal für später auf. Im Prinzip finde ich das nicht schlimm, denn man setzt diese Version ja auf eigene Gefahr ein, jedoch dann einen Rückschritt von einem lang angekündigten RC auf eine Beta zu machen finde ich doch merkwürdig, war da jemand zu voreilig? Das hält mich natürlich nicht davon ab Doctrine weiter zu verwenden ..

Was ich noch erwähnen will, dass ich sehr begeistert von der neuen Webseite bin, die offenkundig auf Symfony basiert. Endlich gibt es eine Api-Doku und ein neues Manual, mit dem man besser arbeiten kann, wie ich finde. Mal schauen, wie es weiter geht ..

Post to Twitter Post to Delicious Post to Digg Post to Facebook

written by Alexander \\ tags: , , , ,

Sep 24

Achtung:
Dieses Turorial bezieht sich auf eine veraltete Version von Doctrine und funktioniert vermutlich mit den neueren 1.x und späteren 2.x Releasen nicht mehr.

Nachdem wir uns in den letzten Beiträgen die generelle Funktionsweise von Doctrine angesehen haben, wollen wir uns nun die weiterführenden Features ansehen. Heute beginnen wir mit dem NestedSet. Mit diesem ist es möglich eine Baumstruktur datenbankseitig abzubilden, zu durchwandern und diese zu ändern. Doctrine bringt dieses Feature nativ mit. Hierbei sei gesagt, dass diese Komponente sich noch ständigen Änderungen unterzieht. Für mein Beispiel verwende ich die Revision 2630, die ich aus dem SVN ausgecheckt habe.

In diesem Beispiel nehmen wir einen Kategoriebaum, in den wir die Produkte aus den vorherigen Beispielen einordnen könnten. Ich lege den Fokus aber nur auf den Baum und die Kategorien, die Verknüpfung zwischen Kategorie und Produkt stellt dann später nur noch eine 1:n-Beziehung dar, falls Verständnisprobleme auftreten, kann ich das gerne im Einzelfall per E-Mail schildern ;) . Continue reading »

Post to Twitter Post to Delicious Post to Digg Post to Facebook

written by Alexander \\ tags: , , , , , , ,