createarp - Ein Model layer für deine Extension
Vor ca. 1 1/2 Jahren las ich das Buch Professionelle PHP 5-Programmierung von George Schlossnagle (Lesetipp: Die neue Ausgabe!), wobei mich vor allem das Active Record Pattern faszinierte, bei der ein Objekt immer genau einem Datensatz einer Tabelle entspricht. Die Eigenschaften des Objekts entsprechen dabei den Feldern in der Tabelle. So lassen sich viele Dinge bewerkstelligen ohne selbst SQL zu schreiben.
createarp
Von ARP begeistert überlegte ich, wie ich dieses Entwurfsmuster auf TYPO3 anwenden kann - heraus kam die Extension createarp.
Einmal installiert, stellt sie ein Backendmodul zur Verfügung, das die Tabellen der installierten Extensions auflistet. Für jede Tabellen gibt es eine Create-Funktion um eine ARP-Klasse für diese Tabelle zu generieren.
Diese anschließend zu benutzen ist kinderleicht:
Anwendung
$item = new myext_item_arp(2); // $item beinhaltet jetzt den Datensatz mit der ID 2 aus der "item"-Tabelle echo $item->title; // Gibt den Inhalt des Feldes title aus $item->title = 'supertest'; // Werte können neu zugewiesen werden $item->update(); // Die neuen Daten werden gespeichert
$item = myext_item_arp::findByField('title', 'supertest'); // Übergebe das zu durchsuchende Feld und den Wert. Nur der erste gefundene Datensatz wird zurückgegeben echo $item->uid; // z.B. 2
$item = new myext_item_arp(1); $item->delete(); echo $item->uid; // FALSE
Datenbank-Relationen
Gibt es für beide Tabellen eine ARP-Klasse unterstützt createarp auch 1:n-Relationen:
// Die "item"-Tabelle hat ein Feld "cat", das die Relation zu einer Kategorietabelle enthält. $item = new tx_myext_item(2); echo $item->cat; // Gibt die ID der Kategorie aus echo $item->cat->title; // Zugriff auf die Felder der Kategorie möglich $item->cat->title = 'new title'; $item->cat->update(); // Das Speichern funktioniert genauso
Erweiterbar
Wer die ARP-Klasse gut findet, aber noch zusätzliche Features braucht, dem sei an's Herz gelegt, dass sich eine erweiternde Klasse super dafür eignet.
In einem Projekt von mir sieht das z.B. etwa so aus:
class tx_myext_cat_model extends tx_myext_cat_arp{ public function getItems($where){ // } }
To Do
Der Extension fehlt noch eine vernünftige Dokumentation und ein paar Features könnte sie auch noch vertragen. Z. B. mit m:m-Relationen umgehen zu können, etwas ausgefeiltere find*-Methoden oder automatisches Aufrufen von insert() bzw. update().
Ob ich die Extension noch weiterentwickle hängt vom Feedback ab. Ich hab' sie bisher immer nur nach meinen eigenen Bedürfnissen gebaut. Meldet noch jemand Interesse an, bin ich gerne bereit auf Anregungen einzugehen.
Was ist mit MVC?
createarp ist kein MVC-Framework sondern nur ein Tool um einen Model Layer zu erstellen. Wer mit lib/div arbeitet muss sich nicht mit createarp auseinandersetzen.
Vor allem empfehle ich den Einsatz von Extbase, sobald TYPO3 4.3 als finale Version erschienen ist.
Doch wer jetzt eine elegante Lösung für Datenbankinteraktion sucht und sich nicht in lib/div einarbeiten möchte, für den könnte createarp durchaus interessant sein.
Ich habe bisher kaum Meinungen von außen gehört. Was haltet Ihr von createarp? Brauchbar? Unnütz?