- path/to/ZendFrameworkQuickstart/scripts$ php load.sqlite.php --withdata
- Schreiben in die Guestbook Datenbank (control-c um abzubrechen):
- 1
- Datenbank erstellt
- Daten geladen.
Ein Modell und eine Datenbanktabelle erstellenBevor wir anfangen, wollen wir uns überlegen: Wo werden diese Klassen leben, und wie werden wir sie finden? Das Standardprojekt, welches wir erstellt haben, instanziert einen Autoloader. Wir können ihm andere Autoloader anhängen, damit er weiss, wo andere Klassen zu finden sind. Typischerweise wollen wir, dass unsere verschiedenen MVC Klassen im selben Baum gruppiert sind -- in diesem Fall application/ -- und meistens ein gemeinsames Präfix verwenden. Zend_Controller_Front kennt den Begriff von "Modulen", welche individuelle Mini-Anwendungen sind. Module mimen die Verzeichnisstruktur, welche das zf-Tool unter application/ einrichtet, und von allen Klassen darin wird angenommen, dass sie mit einen gemeinsamen Präfix beginnen, dem Namen des Moduls. application/ selbst ist ein Modul -- das "default" oder "application" Modul. Als solches richten wir das Autoloading für Ressourcen in diesem Verzeichnis ein. Zend_Application_Module_Autoloader bietet die Funktionalität, welche benötigt wird, um die verschiedenen Ressourcen unter einem Modul mit den richtigen Verzeichnissen zu verbinden, und auch einen standardmäßigen Namensmechanismus. Standardmäßig wird eine Instanz der Klasse wärend der Initialisierung des Bootstrap-Objekts erstellt; unser Application Bootstrap verwendet standardmäßig das Modulpräfix "Application". Daher beginnen alle unsere Modelle, Formulare, und Tabellenklassen mit dem Klassenpräfix "Application_". Überlegen wir uns nun, was ein Guestbook ausmacht. Typischerweise ist das einfach eine Liste von Einträgen mit einem Kommentar (comment), einem Zeitpunkt (timestamp) und oft einer Email-Adresse. Angenommen wir speichern diese in einer Datenbank, dann wollen wir auch einen eindeutigen Identifikator für jeden Eintrag. Wir wollen in der Lage sein, einen Eintrag zu speichern, individuelle Einträge zu holen, und alle Einträge zu empfangen. Als solches könnte das Modell einer einfachen Guestbook-API wie folgt aussehen:
__get() und __set() bieten uns bequeme Mechanismen an um auf individuelle Eigenschaften von Einträgen zuzugreifen und auf andere Getter und Setter zu verweisen. Sie stellen auch sicher, dass nur Eigenschaften im Objekt vorhanden sind, die wir freigegeben haben. find() und fetchAll() bieten die Fähigkeit, einen einzelnen Eintrag oder alle Einträge zu holen, wärend save() das Speichern der Einträge im Datenspeicher übernimmt. Von hier an können wir über die Einrichtung unserer Datenbank nachdenken. Zuerst muss unsere Db-Ressource initialisiert werden. Wie bei Layout und View kann die Konfiguration für die Db-Ressource angegeben werden. Dies kann mit dem Befehl zf configure db-adapter getan werden:
Jetzt muss die Datei application/configs/application.ini bearbeitet werden, und man kann sehen, dass die folgenden Zeilen in den betreffenden Abschnitten hinzugefügt wurden.
Die endgültige Konfigurationsdatei sollte wie folgt aussehen:
Es ist zu beachten, dass die Datenbank(en) unter data/db/ gespeichert wird. Diese Verzeichnisse sind zu erstellen und weltweit-schreibbar zu machen. Auf Unix-artigen Systemen kann man das wie folgt durchführen:
Unter Windows muss man die Verzeichnisse im Explorer erstellen und die Zugriffsrechte so setzen, dass jeder in das Verzeichnis schreiben darf. Ab diesem Punkt haben wir eine Verbindung zu einer Datenbank; in unserem Fall ist es eine Verbindung zu einer Sqlite-Datenbank, die in unserem application/data/ Verzeichnis ist. Erstellen wir also eine einfache Tabelle, die unsere Guestbook-Einträge enthalten wird.
Und damit wir gleich einige Arbeitsdaten haben, fügen wir ein paar Zeilen ein, um unsere Anwendung interessant zu machen.
Jetzt haben wir sowohl das Schema als auch einige Daten definiert. Schreiben wir also ein Skript, das wir jetzt ausführen können, um diese Datenbank zu erstellen. Natürlich wird das nicht in der Produktion benötigt, aber dieses Skriupt hilft Entwicklern die Notwendigkeiten der Datenbank lokal zu erstellen, damit sie eine voll funktionsfähige Anwendung haben. Das Skript ist als scripts/load.sqlite.php mit dem folgenden Inhalt zu erstellen:
Jetzt führen wir dieses Skript aus. Von einem Terminal oder der DOS Kommandozeile ist das folgende zu tun:
Man sollte eine ähnliche Ausgabe wie folgt sehen:
Jetzt haben wir eine voll funktionsfähige Datenbank und eine Tabelle für unsere Guestbook Anwendung. Unsere nächsten paar Schritte sind die Ausarbeitung unseres Anwendungscodes. Das schliesst das Bauen einer Datenquelle (in unserem Fall verwenden wir Zend_Db_Table), und einen Daten Mapper um diese Datenquelle mit unserem Domain Modell zu verbinden, ein. Letztendlich erstellen wir den Controller, der mit diesem Modell interagiert, damit sowohl existierende Einträge angezeigt als auch neue Einträge bearbeitet werden. Wir verwenden ein » Table Data Gateway, um uns mit unserer Datenquelle zu verbinden; Zend_Db_Table bietet diese Funktionalität. Um anzufangen erstellen wir eine Zend_Db_Table-basierende Tabellenklasse. Wie wir es für Layouts und den Datenbankadapter getan haben, können wir das zf Tool verwenden um uns zu assistieren, indem der Befehl create db-table verwendet wird. Dieser benötigt mindestens zwei Argumente, den Namen, mit dem man auf die Klasse referenzieren will, und die Datenbanktabelle auf die sie zeigt.
Wenn man den Verzeichnisbaum ansieht, dann wird man feststellen, dass ein neues Verzeichnis application/models/DbTable/ zusammen mit der Datei Guestbook.php erstellt wurde. Wenn man die Datei öffnet, wird man den folgenden Inhalt sehen:
Das Klassenpräfix ist zu beachten: Application_Model_DbTable. Das Klassenpräfix für unser Modul "Application" ist das erste Segment, und dann haben wir die Komponente "Model_DbTable"; die letztere verweist auf das Verzeichnis models/DbTable/ des Moduls. Alles das ist wirklich notwendig, wenn Zend_Db_Table erweitert wird um einen Tabellennamen anzubieten und optional den primären Schlüssel (wenn es nicht die "id" ist). Jetzt erstellen wir einen » Data Mapper. Ein Data Mapper bildet ein Domain Objekt in der Datenbank ab. In unserem Fall bildet es unser Modell Application_Model_Guestbook auf unsere Datenquelle, Application_Model_DbTable_Guestbook, ab. Eine typische API für einen Data Mapper ist wie folgt:
Zusätzlich zu diesen Methoden fügen wir Methoden für das Setzen und Holen des Table Data Gateways hinzu. Um die initiale Klasse zu erstellen, kann das zf CLI Tool verwendet werden:
Jetzt muss die Klasse Application_Model_GuestbookMapper, welche in application/models/GuestbookMapper.php zu finden ist, so geändert werden, dass sie wie folgt aussieht:
Jetzt ist es Zeit unsere Modellklasse zu erstellen. Wir machen dies, indem wieder das Kommando zf create model verwendet wird:
Wir verändern diese leere PHP-Klasse, um das Model einfach mit Daten zu füllen, indem ein Array an Daten entweder an den Constructor oder an die Methode setOptions() übergeben wird. Das endgültige Modell, welches in application/models/Guestbook.php ist, sollte wie folgt aussehen:
Um diese Elemente alle zusammen zu verbinden, erstellen wir zuletzt einen Guestbook Controller, der die Einträge auflistet, welche aktuell in der Datenbank sind. Um einen neuen Controller zu erstellen, muss das Kommando zf create controller verwendet werden:
Das erstellt einen neuen Controller, GuestbookController, in application/controllers/GuestbookController.php mit einer einzelnen Aktions Methode, indexAction(). Er erstellt auch ein View Skript Verzeichnis für den Controller, application/views/scripts/guestbook/, mit einem View Skript für die Index Aktion. Wir verwenden die "index" Aktion als Landeseite, um alle Guestbook Einträge anzusehen. Jetzt betrachten wir die grundsätzliche Anwendungslogik. Bei einem Treffer auf indexAction() zeigen wir alle Guestbook Einträge an. Das würde wie folgt aussehen:
Und natürlich benötigen wir ein View Skript um damit weiterzumachen. application/views/scripts/guestbook/index.phtml ist zu bearbeiten damit sie wie folgt aussieht:
|