Theorie der FunktionsweiseUm eine MVC Anwendung zu konfigurieren und bereit zur Auslieferung zu bekommen wird ein immer größerer Anteil an Code benötigt sobald mehr Features verfügbar sind: Setzen der Datenbank, Konfiguration der View und View Helfer, Konfiguration der Layouts, Registrierung der Plugins, Registrierung der Aktion Helfer, und andere. Zusätzlich will man oft den gleichen Code wiederverwenden um Tests zu bootstrappen, einen Cronjob, oder ein Service Skript zu haben. Wärend es sehr einfach ist sein Bootstrap Skript einzubauen, gibt es oft Initialisierungen die abhängig sind von der Umgebung - man könnte kein MVC für einen Cronjob benötigen, oder nur den DB Layer für ein Service Skript. Zend_Application zielt darauf ab das alles einfacher zu machen und bietet Wiederwervendbarkeit durch die Kapselung vom Bootstrapping in OOP Paradigmen. Zend_Application ist in drei Bereiche geteilt:
Entwickler erstellen eine Bootstrap Klasse für Ihre Anwendung und erweitern Zend_Application_Bootstrap_Bootstrap oder implementieren (mindestens) Zend_Application_Bootstrap_BootstrapAbstract. Der Einstiegspunkt (z.B. public/index.php) lädt Zend_Application und initialisiert Sie, indem folgendes übergeben wird:
Die Bootstrap Optionen enthalten den Pfad zur Datei welche die Bootstrap Klasse enthält und optional:
Optionen können, ein Array, ein Zend_Config Objekt, oder der Pfad zu einer Konfigurationsdatei sein. BootstrappingZend_Application's zweites Feld der Arbeit ist die Ausführung des Bootstraps der Anwendung. Bootstraps müssen mindestens Zend_Application_Bootstrap_Bootstrapper implementieren, welches die folgende API definiert:
Diese API erlaubt es dem Bootstrap die Umgebung und die Konfiguration vom Objekt der Anwendung zu akzeptieren, die Ressourcen die für das Bootstrapping verantwortlich sind zu melden, und dann das Bootstrappen ausführen und die Anwendung zu starten. Man kann dieses Interface selbst implementieren, Zend_Application_Bootstrap_BootstrapAbstract erweitern, oder Zend_Application_Bootstrap_Bootstrap verwenden. Neben dieser Funktionalität gibt es eine Anzahl anderer Gebiete von Interesse mit denen man vertraut sein sollte. Methoden für RessourcenDie Implementation von Zend_Application_Bootstrap_BootstrapAbstract bietet eine einfache Konvention für die Definition von Methoden für Ressourcen Klassen. Jede geschützte Methode (protected), deren Name mit _init beginnt wird als Ressourcemethode angenommen. Um eine einzelne Ressource Methode zu bootstrappen, muß die bootstrap() Methode verwendet, und der Name der Ressource übergeben werden. Der Name ist der Name der Methode ohne den _init Präfix. Um mehrere Ressourcen Methoden zu bootstrappen, muß ein Array von Namen übergeben werden. Um alle Ressourcen Methoden zu bootstrappen, darf nichts übergeben werden. Nehmen wir die folgende Bootstrap Klasse an:
Um nur die _initFoo() Methode zu bootstrappen, machen wir das folgende:
Um die Methoden _initFoo() und _initBar() zu bootstrappen, machen wir das folgende: Um alle Ressourcen Methoden zu bootstrappen, rufen wir bootstrap() ohne Argumente auf:
Bootstraps die Ressourcen Plugins benutzenUm Bootstraps wiederverwendbarer zu machen wurde die Fähigkeit zur Verfügung gestellt Ressourcen in Ressource Plugin Klassen zu geben. Das erlaubt es Ressourcen einfach über die Konfiguration zu mischen und zu sehen ob Sie passen. Wir behandeln später wie Ressourcen erstellt werden; in diesem Abschnitt zeigen wir nur wie Sie angepasst werden können. Wenn die Bootstrap dazu in der Lage sein soll Ressource Plugins zu verwenden muß man ein zusätzliches Interface implementieren, Zend_Application_Bootstrap_ResourceBootstrapper. Dieses Interface definiert eine API für das Erkennen, Registrieren und Laden von Ressource Plugins:
Ressource Plugins bieten grundsätzlich die Fähigkeit Ressource Initialisierer zu Erstellen die zwischen Anwendungen wiederverwendet werden können. Das erlaubt es die aktuelle Bootstrap relativ klein zu halten, und neue Ressourcen einzuführen ohne Sie in der Bootstrap selbst anzugreifen. Zend_Application_Bootstrap_BootstrapAbstract (und bei Erweiterung Zend_Application_Bootstrap_Bootstrap) implementiert dieses Interface genauso, und erlaubt es Ressource Plugins zu verwenden. Um Ressource Plugins zu verwenden müssen diese in den Optionen spezifiziert werden, die dem Anwendungs Objekt und-oder der Bootstrap übergeben werden. Diese Optionen können von einer Konfigurationsdatei kommen, oder manuell übergeben werden. Optionen sind Paare von Schlüssel zu Optionspaaren, wobei der Schlüssel den Namen der Ressource repräsentiert. Der Ressourcename ist das Segment das dem Klassenpräfix folgt. Die Ressourcen, die zum Beispiel mit Zend Framework ausgeliefert werden, haben den Klassenpräfix "Zend_Application_Resource_"; alles was folgt würde der Name der Ressource sein. Als Beispiel: Das zeigt das die "FrontController" verwendet werden sollte, mit den spezifizierten Optionen. Wenn man beginnt eigene Ressource Plugins zu schreiben, oder Ressource Plugins von dritten anzupassen, muß man der eigenen Bootstrap mitteilen wo nach Ihnen zu suchen ist. Intern verwendet die Bootstrap Zend_Loader_PluginLoader so dass man nur die üblichen Klassenpräfix und Pfadpaare angeben muß. Als Beispiel nehmen wir an das wir eigene Ressource Plugins in APPLICATION_PATH/resources/ haben, und das sie den gemeinsamen Klassenpräfix My_Resource teilen. Man würde diese Information de Anwendungsobjekt wie folgt übergeben: Man ist jetzt in der Lage Ressource von diesem Verzeichnis zu verwenden. Wie Ressource Methoden kann die bootstrap() Methode verwendet werden um Ressource Plugins zu verwenden. Wie bei Ressource Methoden kann man entweder einzelne Ressource Plugins spezifizieren, mehrere Plugins (über ein Array), oder alle Plugins. Zusätzlich kann man mischen und entsprechende Ressource Methoden genauso ausführen.
Ressource RegistryViele, wenn nicht sogar alle, der eigenen Ressource Methoden oder Plugins initialisieren Objekte, und in vielen Fällen werden diese Objekte an anderen Orten der Anwendung benötigt. Wie man auf Sie zugreifen? Zend_Application_Bootstrap_BootstrapAbstract bietet eine locale Registry für diese Objekte. Um eigene Objekte in Ihr zu Speichern müssen diese einfach von den eigenen Ressourcen zurückgegeben werden. Für maximale Flexibilität wird diese Registry intern als "Container" bezeichnet; die einzige Voraussetzung ist das es ein Objekt ist. Ressourcen werden dann als Eigenschaften registriert die nach dem Namen der Ressource benannt sind. Standardmäßig wird eine Instanz von Zend_Registry verwendet, man kann aber jedes andere Objekt spezifizieren wenn man das will. Die Methoden setContainer() und getContainer() können verwendet werden um den Container selber zu manipulieren. getResource($resource) kann verwendet werden um eine angegebene Ressource vom Container zu holen, und hasResource($resource) um zu prüfen ob die Ressource aktuell schon registriert wurde. Als Beispiel nehmen wir eine grundsätzliche View Ressource an:
Man kann Sie prüfen und-oder Sie wie folgt holen:
Es ist zu beachten das die Registry und auch der Container nicht global sind. Das bedeutet das man auf die Bootstrap zugreifen muß um Ressourcen zu holen. Zend_Application_Bootstrap_Bootstrap bietet einige Bequemlichkeiten hierfür: wärend der Ausführung von run(), registriert Sie sich als Front Controller Parameter "bootstrap", was es erlaubt Sie von Routern, Dispatchern, Plugins, und Action Controllern zu holen. Wenn man, als Beispiel, auf die View Ressource von oben im eigenen Action Controller zugreifen will, kann man das wie folgt tun:
Erkennen von AbhängigkeitenZusätzlich zur Ausführung von Ressource Methoden und Plugins, ist es notwendig sicherzustellen das diese einmal und wirklich nur einmal ausgeführt werden; Sie sollen eine Anwendung bootstrappen, und die mehrfache Ausführung von Ihnen kann zu einem Overhead von Ressourcen führen. Zur gleichen Zeit können Ressourcen von anderen ausgeführten Ressourcen abhängen. Um diese zwei Fälle zu lösen bietet Zend_Application_Bootstrap_BootstrapAbstract einen einfachen und effektiven Mechanismus für die Erkennung von Abhängigkeiten. Wie vorher erwähnt werden alle Ressourcen -- ob Methoden oder Plugins -- durch den Aufruf von bootstrap($resource) gebootstrappt, wobei $resource der Name einer Ressource ist, ein Array von Ressourcen oder leer gelassen wird, was zeigt das alle Ressourcen ausgeführt werden sollen. Wenn eine Ressource von anderen Ressourcen abhängig ist, sollte Sie in Ihrem Code bootstrap() aufrufen um sicherzustellen das die Ressource ausgeführt wurde. Weitere Aufrufe von Ihr werden dann ignoriert. In einer Ressource Methode würde so ein Aufruf wie folgt aussehen:
Ressource PluginsWie vorher erwähnt ist die Verwendung von Ressource Plugins ein guter Weg um wiederverwendbare Bootstrap Ressourcen zu erstellen und um so viel wie möglich vom eigenen Code in diskrete Klassen auszulagern. Wärend Zend Framework mit einer Anzahl von standardmäßigen Ressource Plugins geliefert wird, besteht das Ziel darin das der Entwickler eigene schreiben sollte um seine eigenen Notwendigkeiten der Initialisierung zu kapseln. Ressource Plugins müssen nur Zend_Application_Resource_Resource implementieren, oder einfach Zend_Application_Resource_ResourceAbstract erweitern. Das grundsätzliche Interface ist folgendes:
Das Interface definiert einfach was ein Ressouce Plugin an Optionen im Konstruktor akzeptieren sollte, Mechanismen für das Setzen und Empfangen von Optionen, Mechanismen für das Setzen und Empfangen des Bootstrap Objekts, und eine Initialisierungs-Methode hat. Als Beispiel nehmen wir an das wir eine normale View Initialisierung haben die in der eigenen Anwendung verwendet wird. Man hat normale Doctype, CSS und Javascript, und will in der Lage sein diese in einem basis Dokumententitel über die Konfiguration zu übergeben. So ein Ressource Plugin könnte wie folgt aussehen:
Solange man den Präfix Pfad für dieses Ressource Plugin registriert, kann es in der eigenen Anwendung verwendet werden. Besser, weil der Plugin Loader verwendet wird, ist es die gelieferten "View" Ressource Plugin zu überschreiben, und sicherzustellen das man stattdessen die eigene verwendet.
|