Too Cool for Internet Explorer

Data Access Objects mit Propel


Ich verwende schon seit einiger Zeit Creole als Datenbankabstraktionslayer und bin damit super zufrieden. Creole dient auch als untere Schicht für das Projekt Propel.

Bei Propel handelt es sich um eine Implementierung des Entwurfsmusters 'Data Access Obects'. Ziel ist es Datenbankzugriffe von der Anwendung zu entkoppeln. Beim Einsatz von DAO werden Zugriffe per SQL auf eine Datenbank innerhalb einer Applikation vermieden. SQL wird nur noch innerhalb der DAO Bibliotheken verwendet, der Entwickler einer Anwendung basierend auf Data Access Objects greif nur noch auf die bereitgestellten Objekte zu.

Eigentlich habe ich Propel in meiner Unwissenheit immer als 'bloated' betrachtet. Es ist eine recht umfangreiche Bibliothek und benötigt das PHP Build System Phing. Die Abhängigkeiten arten schon etwas aus, allerdings lassen sich alle benötigten Bibliotheken bequem über PEAR installieren:

$> pear install http://creole.phpdb.org/pear/creole-current.tgz
$> pear install http://creole.phpdb.org/pear/jargon-current.tgz

$> pear install http://phing.info/pear/phing-current.tgz

$> pear install http://propel.phpdb.org/pear/propel_generator-current.tgz
$> pear install http://propel.phpdb.org/pear/propel_runtime-current.tgz

Die Runtime Bibliotheken werden nur auf einem System benötigt, auf dem das Propel-basierte Projekt später laufen soll. Umgekehrt müssen auch die Generator Bibliotheken nur auf einem System installiert werden, auf dem die Klassen generiert werden.

Der Einsatz von Propel gestaltet sich einfacher als ich dachte. Eine Datenbank wird per XML beschrieben. Es können auch bestehende Datenbanken gelesen werden und die XML Struktur automatisch generiert werden. Das habe ich allerdings noch nicht ausprobiert. Das Erstellen der XML Datei für die Datenbankstruktur ist relativ einfach und geht schnell von der Hand. Es werden Tabellen und Spalten definiert und Abhängigkeiten über Fremdschlüssel.

Aus einer fertigen XML Datenbankstruktur wird dann zum einen ein SQL-File zum Einspielen in die Datenbank generiert, zum anderen werden alle PHP Klassen erstellt, die zum Zugriff auf die Daten Objekte benötigt werden. Hier kommt das Build System Phing zum Einsatz. Beim Einsatz von Propel erspart man sich das (oftmals auch durchaus nervige) Schreiben von SQL Anweisungen - das Einfügen eines neuen Datensatzes in die Datenbank gestaltet sich dann so einfach wie z.B.:

  1. $address = new Address();
  2. $address->setName('Kunsthalle Schirn');
  3. $address->setCity('Frankfurt');
  4.  
  5. $event = new Event();
  6. $event->setAddress($address);
  7. $event->setName('Van Gogh - Seine unbekannten Werke');
  8.  
  9. $event->save();

Beim Speichern einer Ausstellung wird im obigen Beispiel automatisch zunächst eine neue Adresse angelegt und der Primary-Key des Datensatzes als Adress-ID in der Ausstellung übernommen. Auch Abfragen der Datenbank gestalten sich äusserst einfach.

Propel benötigt mindestens MySQL der Version 4.0.x. Es läuft allerdings auch mit 4.1.x sowie - wie bei mir - mit den Versionen 5.0.x. Allerdings werden neue Features, insbesondere der Version 5 nicht unterstützt. Ausserdem können alle Datenbanken eingesetzt werden, die Creole unterstützt. Neben dem schon erwähnten MySQL wären das PostgreSQL, MS SQL Server und SQLite.



Java Application Server mit PHP Support


Resin von Caucho ist ein Java Application Server mit PHP Unterstützung. PHP Code wird intern in Byte Code übersetzt und soll so bis zu sechs mal schneller sein als das entsprechende Programm unter Apache mit mod_php. Benchmarks, die diese Behauptung untermauern, sucht man leider vergebens.

Im Moment sind die Informationen noch recht spärlich gesäht. Hier kann man sich zumindest einiges rausziehen: so wird wohl PHP5 unterützt - allerdings noch nicht der komplette Sprachumfang.

Neben der Geschwindigkeit soll ein Vorteil der sein, dass man sehr einfach in Java geschriebene Module unter PHP ansprechen kann.

Klingt interessant - auch wenn die Informationen doch recht dünn sind. Sollte man mal im Auge behalten.