Lesen von Werten
- Serie: PHP-Framework Symfony - Teil 2
- Verbindungen schaffen
- Lesen von Werten
Jede dieser Klassen übernimmt dabei eine bestimmte Aufgabe. Nehmen wir als Beispiel die Model-Klasse Appointment, die in unserem Beispiel einen Termin im Kalender repräsentiert. Innerhalb und unterhalb von lib/model/doctrine sind für diese Klasse folgende Dateien abgelegt: AppointmentTable.cl...
Jede dieser Klassen übernimmt dabei eine bestimmte Aufgabe. Nehmen wir als Beispiel die Model-Klasse Appointment, die in unserem Beispiel einen Termin im Kalender repräsentiert. Innerhalb und unterhalb von lib/model/doctrine sind für diese Klasse folgende Dateien abgelegt:
- AppointmentTable.class.php: Diese Klasse ist für alle Operationen zuständig, die auf die Gesamtmenge aller Termine angewendet werden.
- Appointment.class.php: Enthält die Informationen eines einzelnen Elementes/Termins. Die Klasse erbt alle Eigenschaften der Klasse BaseAppointment.
- base/BaseAppointment.class.php: Die Basisklasse eines einzelnen Termins. In dieser Klasse sind alle Eigenschaften definiert. Die Definition entspricht der PHP-Schreibweise unserer schema.yml.
Erstellung der Datenbankstruktur
Damit ist der erste Schritt gemacht und die Klassen für den Zugriff erstellt. Was uns noch fehlt ist die eigentliche Datenbank. Nun wäre es lästig, wenn wir die notwendigen Tabellen von Hand anlegen müssten, da wir die einzelnen Felder bereits in der schema.yml definiert haben. Glücklicherweise bringt Symfony mehrere Kommandozeilenbefehle mit, die sich darum kümmern.
$> php symfony doctrine:build-sql
$> php symfony doctrine:drop-db
$> php symfony doctrine:insert-sql
Das erste der drei Kommandos erstellt eine SQL-Datei mit den SQL-Statements zur Erstellung der Datenbankstruktur. Der zweite Befehl löscht die bisherige Datenbank (falls bereits vorhanden), anschließend wird die Datenbankstruktur neu aufgebaut.Dies ist während der Entwicklung ein ausreichendes Mittel, für ein Produktivsystem aber natürlich ungeeignet. Hier bietet Doctrine mit den sogenannten Migrationen ein Hilfsmittel, um produktiv genutzte Datenbanken von einer Version auf die nächste zu hieven.Damit wir nach dem Ausführen der gezeigten Kommandos nicht jedes Mal vor einer leeren Datenbank stehen, können Beispieldaten innerhalb des Projektes in sogenannten Fixture-Dateien abgelegt werden. Diese Fixtures können ebenfalls per Kommandozeile in die Datenbank geschrieben werden.
$> php symfony doctrine:load-data
Für Fixtures ist in einem Projekt ein spezielles Verzeichnis vorgesehen. Alle Fixture- Dateien werden in den Ordner data/fixtures abgelegt. Hierin können eine oder mehrere Dateien im YAML-Format abgelegt werden, die Daten für Doctrine-Objekte enthalten. Das folgende Listing zeigt ein Beispiel für eine solche Datei. In diesem Fall enthält sie einen Eintrag für die Termin-Tabelle.
Appointment:
Appointment_1:
name: 'IMag kaufen'
starts_at: '2010-08-14 10:00:00'
ends_at: '2010-08-14 10:30:00'
comment: Test
Owner: User_1
created_at: '2010-07-22 08:00:00'
updated_at: '2010-07-22 08:00:00'
User:
User_1:
first_name: Max
last_name: Muster
email: mm@muster.de
UserAppointments:
UserAppointments_1:
Appointment: Appointment_1
User: User_1
In dieser Ausgabe werden wir uns damit begnügen; Daten per Fixture-Dateien in die Datenbank zu schreiben. In den kommenden Ausgaben werden wir diese Aufgabe natürlich auch mit den Möglichkeiten von Symfony erledigen.
Lesen von Werten
Soviel zur Vorarbeit, wir haben nun eine Datenbank, die bereits einige Werte für Termine enthält. Der nächste Schritt ist das Anzeigen dieser Termine in unserem Kalender. In der letzten Ausgabe haben wir uns bereits ein Modul angelegt, das für die Anzeige der Termine in einem Kalender zuständig ist.Um dieses Modul mit den Daten aus der Datenbank zu füttern, ist nur wenig Zusatzaufwand notwendig. In der letzten Ausgabe hatten wir im Controller der Anwendung (apps/frontend/modules/caledar/actions.class.php) der Einfachheit halber nur einen Array mit beliebigen Werten implementiert. Um alle Termine aus der Datenbank zu lesen, genügt es, diesen Controller wie folgt zu verändern.
public function executeIndex
(sfWebRequest $request) {
$this->events =
AppointmentTable::getInstance()
->findAll();
}
Der Befehl findAll der Klasse Appointment- Table liefert einfach alle Termine, die in der Datenbank stehen. Natürlich wollen wir im Kalender nicht die Termine aller Benutzer, sondern nur eines speziellen Users. Nehmen wir etwa an, dass wir alle Termine des Benutzers mit der ID 1 lesen wollen, so müssen wir die Abfrage wie folgt verändern.
public function executeIndex
(sfWebRequest $request) {
$this->events =
AppointmentTable::getInstance()
->findByUserId(1);
}
In einer der kommenden Ausgaben werden wir diese Abfrage noch weiter ausbauen, um Termine eines Benutzers in einem bestimmten Zeitraum auszulesen.
Ausblick

Dank der Verwendung von Doctrine ist der Zugriff auf Datenbankinhalte innerhalb eines Symfony-Projektes ein Kinderspiel. Das Doctrine-Framework ist dabei so mächtig und mit so vielen Funktionen ausgestattet, dass wir in diesem Artikel nur an der Oberfläche gekratzt haben. Dank der guten Dokumentation sowohl innerhalb des Symfony-Projektes als auch von Doctrine sind die weiteren Schritte aber sehr einfach. Doctrine kümmert sich darum, dass die Datenbankabfragen sicher und ohne das mühsame Erstellen von SQL-Statements auskommen.Doctrine befindet sich wie Symfony selbst im Umbruch. Die aktuelle Version zwei, die auch die Basis für die kommende Symfony- Version bilden wird, wurde von Grund auf neu entwickelt und wird mit deutlichen Performance-Zugewinnen aufwarten.In der nächsten Ausgabe unserer Serie werden wir uns der Möglichkeit widmen, wie Termine und Benutzer in der Datenbank gepflegt werden können. Auch hierfür nutzen wir Features von Symfony, um mit möglichst wenig Quellcode zum Ziel zu gelangen.