18.08.2009
09:22

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

Existierenden Datensatz per uid aufrufen
$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 
Existierenden Datensatz per beliebigem Feld aufrufen
$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 
Neuen Datensatz anlegen
$item = new myext_item_arp; // Constructor ohne ID aufrufen
$item->title = 'Neuer Datensatz';
$time = time();
$item->crdate = $item->tstamp;
$item->descr = 'Das ist der neue Datensatz';
$item->insert(); // In der DB speichern
echo $item->uid; // uid ist sofort nach dem Speichern verfügbar 
Datensatz löschen
$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:

1:n
// 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:

createarp erweitern
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?

0 Kommentar(e)

Mein Kommentar

Ich möchte über jeden weiteren Kommentar in diesem Post benachrichtigt werden.

Zurück