Update 21.08.2010 – Ich habe soeben ein Update für die neuste Doctrine Beta hochgeladen!
Sooo. Einige Leser hatten mich gefragt, wann ich meine Zend Framework Integrations-Anleitung denn auf die Beta 1 von Doctrine updaten würde.
Das mache ich in den nächsten Tagen noch, sobald ich Zeit finde. Heute habe ich allerdings schon ein kleines Projekt gestartet: Den zf-doctrine-integrator (Zend Framework Doctrine Integrator).
Prinzipiell besteht das ganze Projekt, welches derzeit auf google code gehostet ist, aus einem Shellscript und den nötigen Dateien zur Integration von Doctrine 2 Beta 1 ins Zend Framework 1.10. Das Shellscript erstellt euch automatisch ein Projekt mit den ZF und Doctrine Bibliotheken, lädt die nötigen Dateien zur Integration aus dem Repository herunter und erstellt automatisch eine vhost Datei.
Das erspart euch bei der Projekterstellung die Arbeit, den Code zur Integration aus alten Projekten oder irgendwelchen Tutorials zu kopieren, außerdem könnt ihr so sicher stellen, immer die aktuellsten ZF und Doctrine Versionen zu nutzen.
Das ganze ist mehr oder weniger überhaupt nicht getestet. Ich würde mich sehr freuen, wenn ihr einfach mal ausprobiert, ob das tool bei euch läuft. Issues könnt ihr auf der Projektseite direkt posten. Die Systemvoraussetzungen und eine (in Zukunft) ausführliche Dokumentation findet ihr im Wiki.
Da haben sie es doch endlich geschafft, die Beta 1 vom Doctrine ORM 2 zu releasen, mit gut 1-2 Monaten Verspätung. Naja. Ich werde am Wochenende in einem Projekt Doctrine updaten, und als Nebenprodukt fällt dann wohl eine Aktualisierung meiner Zend Framework Integrationsanleitung ab.
Ich habe irgendwann übrigens angefangen, ein Shellscript zu schreiben, das die jeweils aktuellste Version des Zend Frameworks und von Doctrine aus den Repositories herunterlädt, in die passenden Verzeichnisse kopiert und anschließend die erforderlichen Dateien zur Integration von Doctrine ins ZF aus einem google code Projekt holt. So eine Art Zend Framework + Doctrine Application creator. Vielleicht kommt da bald mal was zum Testen.
Im Moment das heißeste Thema hier im Blog (wenn “heiß” auch stark übertrieben wäre), ist noch immer Doctrine 2. Ich hatte mich vor einiger Zeit entschieden, die neue Version des Propel-Konkurrenten für ein Projekt zu verwenden. Zwar befindet sich die Software noch im alpha Stadium, (die Beta wird laut der aktualisierten Roadmap mit zwei Wochen Verspätung erscheinen) ich konnte bisher aber keine Bugs feststellen – lediglich einige Verbesserungswünsche und Unzulänglichkeiten.
Eine davon möchte ich hier besprechen.
Continue reading ‘Doctrine 2 – Speichern von Verknüpfungen’
In einem neuen Projekt möchte ich gern Doctrine 2 verwenden, und habe schonmal etwas vorgearbeitet und mir eine Superclass für die Models erstellt. Doctrine 2 lässt es zu, Models von solch einer Superclass erben zu lassen, in welcher man beispielsweise Felder festlegen kann, die in jedem Model zur Verfügung stehen sollen.
Meine Superclass füllt ein paar Funktionslücken und ist mit folgenden nützlichen Methoden ausgestattet:
- Definiert die Felder created und updated (jeweils DateTime) und füllt sie entsprechend beim Erstellen und Updaten des Objektes. Wie in Doctrine 1: “act as timestampable”
- Bietet eine Model::find($id) Methode, welche die gefundene Row oder sonst “null” zurückgibt. Wird Model::find($id, true) aufgerufen, wird ein neues Objekt erstellt und zurückgegeben, wenn $id nicht gefunden wurde. Nützlich, um zum Beispiel die Funktionen zum Erstellen und Bearbeiten von Zeilen nicht doppelt implementieren zu müssen
- $obj->from($array) erwartet ein array(‘feldname’=>’neuer wert’,…) und füllt die Felder des Objektes entsprechend. Nützlich um viele Werte gleichzeitig zu setzen.
- $obj->getFieldName() und $obj->setFieldName($value) geben den Wert von field_name zurück, bzw. setzen ihn. Die setter Methode gibt das Objekt zurück, sodass Methodchaining à la $obj->setField1($val1)->setField2($val)… möglich ist. Die setter und getter unterstützen CamelCase. getCamelCaseString würde das Feld camel_case_string zurückgeben.
Anwendung ist ganz einfach; class My_Model extends Model_Base {}. Außerdem muss in der Zend_Registry der EntityManager von Doctrine abgelegt werden, sodass
$registry = Zend_Registry::getInstance();
$em = $registry->entitymanager;
diesen holen kann! Das ginge auch über eine globale Variable oder sowas.
Hier endlich die Klasse zum Kopieren und Spielen:
Continue reading ‘Meine Superclass für Doctrine 2 Models’
Ich habe eben eine ganze Weile gesucht, bis ich den Grund gefunden habe, wieso eine Setter-Methode in meinem Model offensichtlich zweimal ausgeführt wurde…
Die Methode fromArray(array $array) eines Doctrine Datensatzes, ruft automatisch setKey($value) eines Models auf, wenn “key” ein Schlüssel des übergebenen Arrays und KEIN Feld der Tabelle ist. Dies nicht wissend, habe ich den setter implementiert und selbst aufgerufen – anscheinend unnötigerweise. :)