Page-Controller
Das Herzstück des Adventure PHP Framework bildet der Page-Controller. Die Funktion des Page-Controllers
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 (Document-)Controller 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: Page-Controller) 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 Page-Controller 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 (Document-)Controller direkt beeinflusst werden.
Das bedeutet auch, dass der Page-Controller 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.
-
Mit dem Aufruf der loadDesign() wird ein initiales Template
geladen und geparst.
-
Beim Parsen wird nachgesehen, ob das Template
eine Document-Controller-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 Implementierung von Tags).
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 Document-Controller 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 Page-Controller erwartet nur, dass der Aufruf von
transform() den transformierten Inhalt des Knotens zurückgibt, da dieser
vom aufrufenden Knoten verarbeitet wird.
Weitere Informationen zur Verarbeitung von Taglibs können dem Forum-Thread
Ein einfaches Formular erstellen.
entnommen werden.
Eine weiterführende Beschreibung des Timing-Modells findet sich im
Wiki.
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 [i]http://wiki.adventure-php-framework.org/de/Timing-Modell_des_Page-Controller[/i].