PHP Datenbankabstraktion mit Doctrine

Die PHP Datenbankabstraktion mit Doctrine bietet jede Menge Vorteile auf die ein modernes PHP Projekt nicht verzichten sollte. Ich zeige euch wie man Doctrine aufsetzt und in einem Projekt sinnvoll einsetzt.

PHP Datenbankabstraktion mit Doctrine

PHP Datenbankabstraktion mit Doctrine

Immer wenn man ein neues Projekt von Grund auf beginnt sollte man sich schon früh Gedanken über die Anbindung an die Datenbank machen. In meinem Racing Manager Projekt habe ich darauf verzichtet und alle SQL Statements über die PDO Schnittstelle per Hand in einer einzigen Database Klasse erstellt, wobei diese Klasse nur als Bindeglied zur Datenbank dienen soll und keine Programmlogik enthalten soll. Das ging vor allem zu Beginn sehr gut, hat sich aber im Nachhinein als umständlich erwiesen. In einer mehrere tausend Zeilen große Datei findet man alle Selects, Inserts und Updates. Das macht die Sache schwer wart- und erweiterbar. Es kam zu folgenden negativen Effekten:

  • doppelte Funktionen
  • verschachtelte Funktionen mit Programmcode
  • chaotische Gliederung

Damit das Projekt besser strukturiert ist empfehlen sich Datenbank Abstraktionslayer. Diese sollen nur Logik für die Datenspeicherung beziehungsweise Abfrage von Daten zur Datenbank enthalten. Objektorientierung ist gerade bei modernen Projekten ein Muss und zusätzlich sollte der Layer das Datenbanksystem dahinter komplett austauschbar machen (also egal ob MySQL, MSSQL, Oracle, oder ähnliches).

Installation

Eines der führenden Systeme im Open Source Sektor bei PHP ist dafür Doctrine.

Installation Composer

Die Installation von Composer funktioniert wie folgt:

Composer wird zwingend benötigt, damit man Doctrine installieren kann. Ich habe das auf einem virtuellen Server gemacht. Damit hatte ich root Rechte und die Installation hat problemlos geklappt. Man beachte: composer wird in einen Systemordner kopiert. Hat man die Rechte nicht muss man auf ein anderes Verzeichnis ausweichen. Wichtig ist nur, dass composer danach ausgeführt werden kann. Sollte man composer auf einem Shared Host gar nicht installieren können braucht man trotzdem nicht auf Doctrine verzichten. Man kann die folgende Doctrine Installation auch auf einem virtuellen Server mit root rechten erledigen und das Projektverzeichnis samt Doctrine dann unabhängig von Composer auf den Webspace kopieren.

Installation Doctrine

Man erstellt eine neue Datei composer.json im Projektverzeichnis. Es hat folgenden Inhalt:

Ausgeführt wird das dann mit folgenden Befehl:

Es wird nun im aktuellen Ordner ein Unterverzeichnis vendor erstellt in dem der Source Code von Doctrine liegt. Diesen muss man nun ins eigene Projekt integrieren, am besten über eine bootstrap.php Datei in der allgemeine Einstellungen für das neue Projekt festgelegt werden. Das geht so:

Der Source Code und die Dokumentation ist auch auf der Webseite von Doctrine beschrieben.

Konfiguration

Wie bereits zur Installation kurz erwähnt sollte man Doctrine in einer bootstrap.php Datei initialisieren. Meine bootstrap.php meines Demoprojekts sieht folgendermaßen aus:

In dieser Datei werden mit DATENBANK, BENUTZER und PASSWORT Datenbank Verbindungsdaten angegeben. Als Treiber verwenden wir pdo_mysql, das müsste man an die verwendete Datenbank angepasst werden. Mir diesen Schritten ist Doctrine für das Projekt initialisiert und man kann erstellte Entities verwenden.

Entities erstellen

Doctrine ist dafür gemacht worden, dass die Datenbank abstrahiert wird. Das heißt als Entwickler braucht man sich keine Gedanken über die dahinter liegende Datenbank machen. Generell gibt es zwei Ansätze wie man mit Doctrine arbeitet:

  • Tabellen automatisch erstellen
    Der Entwickler kann nur PHP und er erstellt für alle Models die in der Datenbank gespeichert werden sollen entsprechende Entites. In der Doctrine Dokumentation steht wie man das macht. Es geht darum in der Klasse Kommentare in einer bestimmten schreibweise hinzuzufügen. Durch diese Informationen kann Doctrine die Daten der Klasse in die Datenbank kopieren. Das ist offenbar der meist genutzte Ansatz.
  • Models automatisch erstellen
    Aus meiner Erfahrung der viel wichtigere Ansatz ist aber aus einem zuvor bekannten Datenbankmodell automatisiert Entites, also PHP Klassen zu erstellen. Das will ich in den nächsten Abschnitt an einem Beispiel zeigen.

Ich habe ein Datenbank mit der Tabelle Message erstellt. Message enthält neben einer Id mit Autowert noch ein varchar für die IP Adresse und ein datetime Feld für den Timestamp. Die Entities für alle Tabellen einer Datenbank und die dazugehörigen Getter uns Setter Methoden können mit folgenden zwei Befehlen automatisch erstellt werden:

Die Entity Klassen werden im Ordner entities erstellt.

Test

Die Entities wurden erstellt. Nun zeige ich noch an einem kleinen Skript wie man mit Doctrine und den daraus erstellten Entities Abfragen macht. Die index.php Datei meines Projekts sieht folgendermaßen aus:

Zuerst wird die bootstrap.php Datei mit der Doctrine Initialisierung eingebunden. Außerdem müssen wir alle verwendeten Entites einbinden, in dem Fall nur die Message.

Im ersten Teil erstellen wir uns ein neues Message Objekt, setzen die Werte für den Text und den Zeitstempel und speichern dieses ab. Nach dem flush() Aufruf steht der Wert in der Datenbank. Gratulation, du hast gerade die IP Adresse des Aufrufs von index.php in der Datenbank geloggt.

Im zweiten Teil zeige ich noch wie man Daten aus der Datenbank abfragt. Dazu erstellt man eine Query mit einem Select Statement. Als Resultset bekommt man das Message Objekt beziehungsweise ein Array aus den Ergebnissen. Ich habe das einfach ausgegeben.

Fazit

Es ist nicht ganz einfach Doctrine zum Laufen zu bringen. Als PHP Anfänger kann das schon recht kompliziert sein. Läuft es aber einmal, dann nimmt es sehr viel arbeit ab. Die Kommunikation mit der Datenbank ist zu fast 100% gekapselt und man braucht sich kaum noch Gedanken machen. Das Datenbanksystem dahinter ist nun ganz einfach austauschbar. Außerdem ist der objektorientierte Ansatz für eine spätere Weiterentwicklung oder Wartung gegenüber gewachsener System rein auf PDO ein großer Vorteil.

Was denkt ihr zu Doctrine? Gibt es vernünftige Alternativen?

(Visited 173 times, 1 visits today)

Das könnte auch interessant sein...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.