FOL9000

Views und Request mit dem Bean-Container verbinden

von

Eigentlich ist mit den bisherigen Artikeln das php-Micro-Framework f9 komplett beschrieben. Aber: Noch sind einige Klassen zu allgemein und nicht perfekt aufeinander abgestimmt. Zwei neue Klassen schaffen hier für Views und Request Abhilfe.

Die Notwendigkeit, die Klassen in f9 enger zu verzahnen zeigt sich schon beim Request-Dispatcher. Zwar können beim Request-Dispatcher Funktionen und Klassen-Methoden als Ziele angegeben werden, jedoch keine Beans aus dem BeanContainer. Ein ähnliches Problem zeigt sich bei den Views: Für den ViewResolver können keine Bean-Namen aus dem Container als View-Namen angegeben werden.

Beide Probleme lassen sich leicht mit abgeleiteten Klassen und wenigen neuen Zeilen lösen.

Controller aus dem Container:
Der BeanAwareRequestDispatcher

Zunächst zu Controllern bzw. Zielen des Request-Dispatching. Um zu erreichen, dass Methoden von Beans aus dem Container vom RequestDispatcher aufgerufen werden können, muss in der Routing-Datei ein neuer Typ angegeben werden (bean), der Name der Bean muss angegeben werden und entsprechend muss der abgeleitete Dispatcher um einen Loader und einen Runner für diesen Typ erweitert werden.

Dies leistet der BeanAwareRequestDispatcher. Er ist natürlich wie alle f9-Klassen namespaced und entsprechend einzubinden:

use net\f9\BeanAwareRequestDispatcher;

Eine beispielhafte Routing-Datei für Beans sieht dann so aus:

[show-user]
method = GET
path = "/user/?(\d+)"
type = bean
bean = user-controller
function = user

Interessant ist hier eigentlich nur der Typ bean und der neue Eintrag bean. Unter bean wird der Name der Bean aus dem Container angegeben. Unter function ist wie auch beim Typ class die aufzurufende Methode angegeben.

Natürlich muss der Request-Dispatcher den Bean-Container kennen, sonst kann er keine Beans daraus anfordern. Eine neue getInstance()-Methode wird deshalb um einen Parameter für den Container erweitert:

BeanAwareRequestDispatcher::getInstance($container);

Mehr ist nicht nötig. Und nur als Hinweis: Da der BeanAwareRequestDispatcher vom RequestDispatcher abgeleitet ist, kann er natürlich auch genau wie dieser mit den dort bekannten Typen eingesetzt werden (auch wenn ich einen Mix für nicht sonderlich ratsam halte).

Views aus dem Container:
Der BeanAwareViewResolver

Beim neuen View-Resolver BeanAwareViewResolver geht es eigentlich genauso: Ihm muss im Konstruktor der Bean-Container übergeben werden und beim Auflösen eines View-Namens schaut er zunächst im Container, ob es dort eine Bean unter diesem Namen gibt. Findet er dort nichts, geht weiter wie gehabt.

Der Einsatz des BeanAwareViewResolver unterscheidet sich vom Einsatz des SimpleViewResolver kaum. Einziger Unterschied ist, dass man ihm den Container übergeben muss, entweder im Konstruktor oder per Setter:

use net\f9\BeanAwareViewResolver;

$res = new BeanAwareViewResolver($beanContainer);

// Oder:

$res = new BeanAwareViewResolver();
$res->setBeanContainer($beanContainer);

Auch hier braucht’s nicht mehr.

Downloads

Beide Klassen gibt es einzeln zum Download.

Der neue Request-Dispatcher:
[download id=“10″]

Und der neue View-Resolver:
[download id=“11″]

Das komplette f9-Framework mit allen Klassen und Beispielen:
[download id=“12″]

Kommentare sind geschlossen.