Pagecontroller
Das Herzstück des Adventure PHP Framework bildet der Pagecontroller. Dieser ist eine Komponente,
die aus diversen Basis-Klassen besteht, die im Kapitel
Klassen
beschrieben sind. Die Funktion des Pagecontrollers besteht darin, einen allgemeingültigen Rahmen
für Applikationen zu bieten, die nach dem
MVC Muster implementiert werden.
Er verfügt daher über Mechanismen zum Laden und Verarbeiten von
Templates mit Hilfe der Funktionen von
TagLibs, zur Ausführung von
Controllern und zum Handling des MVC-Baumes,
der mit Hilfe der TagLibs erzeugt wird.
Wegen der Baum-Struktur der GUI-Elemente spricht man in diesem Zusammenhang auch vom
HMVC
Pattern. Dieses sieht vor, dass es einen hirarchischen Baum bestehend aus lauter kleinen MVC-Einheiten
gibt, der mit Hilfe eines Mechanismus (hier: Pagecontroller) verwaltet wird. Beim HMVC Pattern geht
man zudem davon aus, dass das Model nicht wie beim MVC Pattern stark an eine Zelle gebunden ist,
sondern mehreren Zellen zur Verfügung stehen kann. So ist es auf eine um vielfaches flexiblere
Weise möglich, Module und Applikationen zu erstellen.
Da der Pagecontroller nur den Rahmen absteckt, bzw. für das Ausführen des ihm zu eigenen
Workflows zuständig ist, kann die Applikationslogik durch eigene
TagLibs und
Controller direkt beeinflusst werden. Das
bedeutet auch, dass der Pagecontroller selbst unabhängig von in Tags definierter Logik handelt.
Damit ist es möglich, Tags mit sehr unterschiedlichen Funktionen zu erstellen (z.B. Formulare,
Taglibs zum Einbinden weiterer Templates, Platzhalter, ...). Das folgende Ablauf-Diagramm zeigt den
angesprochenen Workflow und gibt Aufschluss darüber, wo der Entwickler eingreifen kann um eine
Anforderung seiner Applikation umsetzen zu können. Per Klick kann das Bild vergrößert
werden!
Im folgenden soll der Ablauf nochmal textuell beschrieben werden:
-
Zu Beginn einer Anfrage wird die
Bootstrap-Datei
(zumeist: index.php) aufgerufen.
-
In dieser wird bei Verwendung des Pagecontrollers das Page-Objekt instanziiert. Bei der Erzeugung
des Objekts wird der in der Registry
definierte Eingabe-Filter
ausgeführt. Diesem kommt die Aufgabe zu, die Benutzer-Eingaben aufzubereiten (Stichwort:
URL-Rewriting) und hinsichtlich
Sicherheit zu überprüfen.
-
Mit dem Aufruf der loadDesign() wird ein initiales
Template geladen und geparst.
-
Beim Parsen wird nachgesehen, ob das Template
eine DocumentController-Anweisung
und weitere bekannte Tags beinhaltet.
-
Ist eine Controller-Anweisungen
vorhanden, wird diese extrahiert und die Informationen für die Transformation vorbereitet.
-
Sind bekannte Tags vorhanden,
werden diese analysiert und als Kind-Objekte in den aktuellen DOM-Knoten eingehangen.
-
Beim Parsen eines Tags wird die für die Tag-Definition relevante TagLib-Implementierung
(PHP-Klasse) instanziiert und ihr werden die Attribute und der Inhalt des Tags mitgegeben.
Anschließend wird die Methode onParseTime() aufgerufen (siehe
TagLibs erstellen).
Die Implementierung der Funktion onParseTime() bestimmt dabei über die
weitere Vorgehensweise mit den Inhalten des Tags, der wiederum weitere Tags beinhalten kann.
Daher wird innerhalb dieser üblicherweise der Inhalt weiter analysiert, bekannte Tags als
Kinder erzeugt...
-
Nach dem Parsen eines Knotens werden die Kinder in den Objektbaum eingehangen und es wird die
onAfterAppend()-Methode jedes Kindes aufgerufen. In diesem Stadium "kennen"
sich die einzelnen Knoten über die $this->__ParentObject- und
$this->__Children-Referenzen. In dieser Funktion einer TagLib werden üblicherweise
Operationen platzieren, bei denen ein Vater-Knoten oder ein dem Vater benachbarter Knoten relevant
ist.
-
Nach Abschluss der loadDesign()-Methode steht ein kompletter APF-DOM-Baum zur
Verfügung, der aus einer vom Entwickler direkt beeinflussten Anzahl an Knoten und deren
Informationen besteht.
-
Der Aufruf von $Page->transform() wird der DOM Baum rekursiv durchlaufen und
transformiert. Dabei ist jedes Element für seine Transformation selbst zuständig. Da
viele Knoten üblicherweise von der Klasse Document ableiten, gestaltet sich
der Workflow wie folgt: zunächst wird überprüft, ob für den aktuellen Knoten
ein DocumentController definiert wurde. Falls ja, wird die dazu notwendige Klasse eingebunden,
ihr werden die nötigen Referenzen, Attribute und Inhalte mitgegeben und anschließend
wird die Methode transformContent() aufgerufen.
-
Nach dem Ausführen des Controllers
wird die Liste der Kinder durchlaufen und diese werden ebenso durch den Aufruf der
transform()-Methode transformiert. Die Knoten steuern dann selbst, in welcher
Form die Transformation stattfinden soll. Der Pagecontroller erwartet nur, dass der Aufruf von
transform() den transformierten Inhalt des Knotens zurückgibt, da dieser
vom aufrufenden Knoten verarbeitet wird.
-
Nachdem alle Knoten transformiert wurden steht der fertige HTML-Inhalt zur Ausgabe bereit. Dieser
wird dann noch durch den Ausgabefilter
- sofern nicht deaktiviert - gefiltert und anschließend ausgegeben.
Weitere Informationen können dem Forum-Thread
"
Ein Einfaches Formular erstellen."
entnommen werden.
Kommentare
Möchten Sie den Artikel eine Anmerkung hinzufügen, oder haben Sie ergänzende Hinweise? Dann können Sie diese
hier einfügen. Die bereits verfassten Anmerkungen und Kommentare finden Sie in der untenstehenden Liste.
1
Christian
08.05.2010, 14:55:56
Weitere Hinweise zum Timing-Modell finden sich im Wiki unter http://wiki.adventure-php-framework.org/de/Timing-Modell_des_Page-Controller.