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.
- 10 subjektive Kriterien für ein gutes PHP (micro-) Framework
- f9 – noch ein neues PHP-Micro-Framework
- Eine beispielhafte f9-Anwendungsarchitektur
- Der f9-RequestDispatcher
- Die f9-View-Klassen
- Ein erstes Mini-Beispiel mit f9
- Die f9-Datenbank-Klasse
- Sessions in f9
- Der f9-Dependency-Injection-Container
- Views und Request mit dem Bean-Container verbinden
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″]