Artikel » PHP-Frameworks im Test (6)
PHP-Frameworks im Test (6)
3.4. Adventure PHP Framework
Das Adventure PHP Framework legt
http://adventure-php-framework.org/Seite/Roadmap
die Roadmap für Releases bis Mitte 2008 fest. Darin werden die Features der Releases aufgeführt,
so dass der Entwickler ein Gefühl, für die kommenden Erweiterungen für seine Projekte
bekommt.
Auf der Download-Seite des Projektes (
http://adventure-php-framework.org/Seite/Downloads)
steht eine Übersicht über die aktuell veröffentlichten Releases zur Verfügung.
Im Fall des aktuellen Testkandidaten sind dies das stable Release 1.3 und 1.4, wobei die aktuelle
Version eine zu PHP 5 kompatible Version ist.
Die Release-Packages liegen in der Form ZIP, TGZ und BZ2 vor. Die Dokumentation ist in separaten
Paketen und in unterschiedlichen Formaten (CHM, HTML+ZIP) erhältlich. Die zu einer Version
gehörigen Dokumentation kann auch online eingesehen werden.
Für das Adventure PHP Framework steht kein CVS/SVN-Repository zur Verfügung. Bugfix-Releases
sind nur nach Anfrage per Kontaktformular verfügbar.
Da das Projekt über keine Trac- oder JIRA-Installation verfügt wird Bug-Tracking und
Ticketing manuell über
http://adventure-php-framework...ugtracking
abgewickelt. Das hat den Nachteil, dass die Diskussionen zu Bugreports nur verzögert online
einsehbar sind.
Eine Version für PHP 4 ist erhältlich. Diese dient im aktuellen Release auch als
Haupt-Entwicklungs-Zweig (siehe Roadmap).
Die installierte Version ist zu PHP 5 (im Test: Version 5.2.1) kompatibel.
Der Einsteiger erhält auf der Download-Seite ein Package mit dem Namen
apf-demopack-*,
das alle relevanten Framework-Pakete und die komplette Webseite als Beispiel-Anwendung enthält.
Zur Installation muss dieses heruntergeladen und im DocumentRoot des Webservers oder einem VHOST
entpackt werden. Um das URL-Rewriting-Feature testen zu können sollte letztere Variante vorgezogen
werden. Um das URL-Rewriting zu deaktivieren, muss in der Datei
/apps/config/core/applicationmanager/INIT_demosite.ini
APF-Template
APPS__URL_REWRITING = false
gesetzt werden und die RewriteEngine des Apache Webservers mit
APF-Template
RewriteEngine Off
in der Datei
/.htaccess abgeschaltet werden. Damit funktionieren Anwendungen auch
mit herkömmlichen URLs. Diese und weitere Hinweise finden sich in der Datei
README.txt
des Demo-Packages. Das Paket
apf-codepack-* enthält bei jedem Release
den Code des Frameworks ohne die Beispiel-Applikation und kann für Updates oder andere
Installationen genutzt werden.
Die mitgelieferten Beispiel-Applikationen müssen zunächst nicht konfiguriert werden und
sind ohne Zutun des Entwicklers lauffähig. Zum Betrieb des Demo-Gästebuch bzw. der Kommentar-
Funktion auf den Dokumentationsseiten sind die Hinweise in der Datei
README.txt des
apf-demopack-*-Releases zu beachten.
Wie bereits unter 3.4.2 erwähnt stehen alle Applikationen als Demo-Applikationen zur Verfügung
und die Details zur Implementierung werden unter
http://adventure-php-framework...ktFormular und
http://adventure-php-framework...GaesteBuch näher erläutert.
http://adventure-php-framework.org/Seite/HalloWelt kann der Einsteiger als
erstes Beispiel für die Erstellung einer Applikation nutzen. Dort wird beschrieben, welche Schritte
notwendig sind um eine einfache Applikation mit dem Framework zu erstellt. Eine erweiterte Einführung
erhält der interessierte Anwender im Kapitel Grundlagen
(
http://adventure-php-framework...Grundlagen).
Dort erfährt der Nutzer, wie welche Programm- bzw. Konfigurationsdateien eine Applikationen
benötigt. Weiterhin steht ein HOWTO zum Erstellen einer einfachen Webseite mit Hilfe des
Frameworks unter
http://adventure-php-framework...eErstellen
zur Verfügung. Dieses kann als Grundlage für den Betrieb der mitgelieferten Beispiel-
Applikationen sowie zur Entwicklung weiterer Module genutzt werden.
Dem Thema Templates ist in der Dokumentation ein eigenes Kapitel gewidmet. Auf
http://adventure-php-framework.org/Seite/Templates werden die Grundlagen
des Template-Baus und die Möglichkeiten der Gestaltung von Templates erläutert. Die hier
vermittelte Struktur und die Funktion von Templates ist eine völlig andere, verglichen mit den
vorherigen Test-Kandidaten. Das Adventure PHP Framework verfolgt einen generischen GUI-Ansatz,
der dem Entwickler erlaubt, eine beliebig komplexe GUI-Struktur zu generieren. Wie auch im Kapitel
Klassen unter "DOM-Objektmodell der Präsentations-Schicht" geschrieben steht, wird die GUI über
einen Adventure PHP Framework-eigenes DOM abgebildet, auf das der Programmierer beliebig Einfluss
nehmen kann (
http://adventure-php-framework.org/Seite/Klassen).
Das Einklinken weiterer Funktionen oder Module in die bereits vorhandene GUI wird damit stark
vereinfacht. Diese Tatsache unterstützt das komplett offene URL-Design, das keine starren
Strukturen wie
APF-Template
http://www.example.com/[{Module}/]{Controller}/{Action}[/{Param1}/../{ParamN}]
kennt, sondern frei gestaltet werden kann. Somit ist es möglich verschiedenste unabhängige
Module in einer GUI zu betreiben.
Die Test-Seite soll wie bei den bisherigen Probanden auch aus den Bereichen
- Menü
- Content
- Top-Menü
- News-Bereich
bestehen und die dafür bestimmten Inhalte tragen. Da Layouts im Adventure PHP Framework aus
mehreren Views bestehen können, die für sich genommen "kleine MVC-Einheiten" sind, kann
das Layout sehr einfach erstellt werden. Zunächst werden die dafür notwendigen Ordner
angelegt und ein neues Projekt erstellt:
Um das URL-Rewriting-Feature testen zu können,wurde im Ordner, in dem das Release-Package entpackt
wurde, ein neuer Ordner mit dem Namen
testapp angelegt. In diesem wurde die
index.php
und die
.htaccess aus dem Demo-Projekt und die Struktur unter
/frontend kopiert. Um
den neuen Ordner als DocumentRoot zu haben, musste die VHOST-Konfiguration um diese Änderung
angepasst werden. Das "Hallo Welt!"-Beispiel beschreibt nun, welche Schritte zum Anlegen einer neuen
Seite notwendig sind. Dazu muss zunächst die INIT-Datei
INIT_testapp.ini unter
/apps/config/core/applicationmanager angelegt und eine Ordnerstruktur unter
/apps/sites/testapp (vgl. Demo-Projekt) erzeugt werden. Diese beinhaltet zunächst die
Ordner
APF-Template
sites/
testapp/
pres/
documentcontroller/
templates/
Der Ordner
templates ist der Ablageort für Template-Dateien und wie oben beschrieben
werden fünf Template-Dateien darin angelegt, die die einzelnen Bereiche der Seite plus ein
"Master-Layout" beinhalten. Das sind:
- webseite.html: Master-Layout
- content.html: Content-Bereich
- topmenu.html: Bereich des oberen horizontalen Menüs
- news.html: News-Bereich in dem ein Banner eingeblendet wird
- menu.html: Inhalt des rechten vertikalen Menüs
Das Master-Template
webseite.html wird mit dem HTML-Gerüst gefüllt, die übrigen
Dateien erhalten die jeweils relevanten Bereiche der Seite. Die einzelnen "Unter-Views" können
im Master-Layout nun mit dem XML-Tag
<core:importdesign /> an den vorgesehenen
Stellen eingebunden werden. Da das Adventure PHP Framework die Dateien per Namespace adressiert - was
ein relativer Pfad zum
APPS__PATH ist - müssen die Templates im Ordner
/apps/sites/testapp/pres/templates wie folgt in der Datei
webseite.html adressiert
werden:
APF-Template
<core:importdesign namespace="sites::testapp::pres::templates" template="menu" />
Um die Webseite nun aufrufen zu können muss die
index.php angepasst werden:
PHP-Code
// Pfad zum Applikations-Verzeichnis angeben
define('APPS__PATH','../apps');
define('APPS__NAME','testapp');
// ApplicationManager einbinden
require_once(APPS__PATH.'/core/applicationmanager/ApplicationManager.php');
// Front-Controller einbinden
import('core::frontcontroller','Frontcontroller');
// Front-Controller erzeugen
$fC = &Singleton::getInstance('Frontcontroller');
// Context und Sprache setzen
$fC->setContext('sites::testapp');
$fC->setLanguage('de');
// Front-Controller starten
$fC->start('sites::testapp::pres::templates','website');
// Benchmark-Report ausgeben, falls benchmarkreport=true in der URL enthalten ist
if(isset($_REQUEST['benchmarkreport'])){
if($_REQUEST['benchmarkreport'] == 'true'){
$T = &Singleton::getInstance('BenchmarkTimer');
echo $T->createReport();
}
}
Die gewünschte Webseite ist nun mit einem leeren Inhalts-Bereich zu sehen. Für die Füllung
des Inhaltsbereiches kann nun entweder die Template-Datei
content.html gefüllt
werden, oder der auf
http://adventure-php-framework...TagLibTags
beschriebe Tag
<doc:createobject /> verwendet werden. Dieser sucht
in einem Ordner unterhalb des DocumentRoots - standardmäßig
/frontend/content/ -
nach Content-Dateien der Form
c_([a-z]{2})_([a-z0-9]{3,}).html, und ausliest deren
Inhalte aus und stellt sie dar. Im XML-Tag kann konfigurierten werden, welcher URL-Parameter verwendet
werden soll. In diesem Fall muss - um das geforderte URL-Layout einhalten zu können - der
Parameter
Seite sein. Eine weitere Möglichkeit wäre es, für das
Template
content.html einen Document-Controller zu definieren, der den Inhalt aus einer
Datenbank liest. Um die Vergleichbarkeit mit den bisherigen Bewerbern zu gewährleisten
wurde im Template
content.html der Quelltext
APF-Template
<core:addtaglib
namespace="tools::html::taglib"
class="CreateDocumentFromFileTag"
prefix="doc"
name="createobject"
/>
<document:createcontentobject requestparam="Seite" defaultvalue="Startseite" />
eingefügt. Der
<core:addtaglib />-Aufruf muss hier deshalb platziert
werden, damit dem Page-Controller mitgeteilt wird, dass eine weitere TagLibrary im aktuellen
Document verwendet wird. Ohne diese Bekanntgabe wird der Tag nicht ausgeführt. Um nun
Inhalte angezeigt zu bekommen müssen die hier verwendeten Dateien im Ordner
/frontend/content
angelegt werden. Zum Test sind das
c_de_startseite.html,
c_de_benchmark.html
und
c_de_klassen.html. Damit wurde die Basis der Test-Seite geschaffen und die
angelegten Seite können aufgerufen werden.
Controller werden - wie bereits in "Template-Bau / Layoutgestaltung" angesprochen - nicht zentral
über einen Dispatcher gemäß den URL-Parametern aufgerufen, sondern auf Anforderung
innerhalb eines DOM-Knotens und mit den Informationen der URL, bzw. der Applikation, falls erforderlich.
Die Implementierung nach dem Page-Controller- und Composite-Pattern sieht zudem vor, dass jeder
- wie es das Framework nennt - Document-Controller vom abstrakten Controller
BaseDocumentController
erbt. Dieser besitzt die vom Framework zur Verfügung gestellten Möglichkeiten und unterstützt
den Anwender bei der Implementierung von Controllern.
Controller im Adventure PHP Framework werden im Template definiert. Damit kann der Entwickler selbst
entscheiden, ob er in einem Template (=DOM-Knoten) dynamische Inhalte erzeugen möchte oder nicht.
Möchte der Programmierer später dem Template einen Controller hinzugefügen, so kann dies
ohne Änderung der restlichen Applikation passieren. Die nötigen URL-Informationen kann sich
der Controller dabei aus der für ihn erweiterten URL ziehen.
Ein weiterer Unterschied zwischen den Kandidaten
CakePHP,
Codeigniter,
Zend Framework einerseits und dem Adventure PHP Framework andererseits, ist die Implementierung
des FrontControllers. Hier können - ähnlich wie die Controller für einen DOM-Knoten -
mehrere Actions in der URL platziert und ausgeführt werden. Damit ist der Anwender nicht darauf
beschränkt nur eine Applikation mit einem Controller und einer Action zu einer Zeit mit
Informationen bedienen zu können, sondern es können mehrere Applikationen, die gemeinsam in
einer GUI dargestellt werden, komplett unabhängig implementiert und ausgeführt werden. Dies
bringt den Vorteil mit sich, dass eine Gesamt-Applikation aus beliebig vielen Einzel-Applikationen
von unterschiedlichen Entwicklern und Teams zusammen "gesteckt" werden kann, solange sich diese
an die Paradigmen des Frameworks halten. Das in
Kapitel 4.3.4., Abschnitt
Erweiterbarkeit
der GUI-Komponenten, diskutierte Integrationsproblem von verschiedensten Teil-Applikationen in
eine ganze ohne Auflösung von Abhängigkeiten zu einer anderen Applikation in jeder der
Teil-Applikationen - siehe auch
http://www.zfforum.de/showthread.php?t=685 -
ist damit auf einfache Art und Weise möglich. Die Implementierung von Actions für den
FrontController wird unter
http://adventure-php-framework...controller
genauer beschrieben.
Der Page-Controller des Adventure PHP Frameworks kennt so genannte
TagLibs. Diese sind
die Definition einer bestimmten Funktionalität, die hinter einem XML-Tag steckt. Viele der oben
verwendeten XML-TagLibs sind bereits im Framework integriert und können verwendet werden. Einige
von diesem müssen vor der Verwendung dem aktuellen
Document zunächst bekannt gemacht
werden.
Da der integrierte TagLib-Parser beliebige TagLibs erkennen kann, können diese vom Entwickler
genutzt werden, um die Funktionalitäten des Frameworks und damit die einer Applikation oder
einer Webseite erweitert werden.
http://adventure-php-framework...TagLibTags
beschreibt die bereits vorhandenen Libraries und
http://adventure-php-framework...sErstellen
erörtert, wie neue TagLibs erstellt werden können. Nach Meinung des Autors verfügt
das Adventure PHP Framework damit über eine sehr komfortable Möglichkeit, die
Funktionalitäten des Frameworks und die Möglichkeiten einer GUI zu erweitern.
Für die Analyse wurde die unter
http://adventure-php-framework...sErstellen,
Kapitel
3.1. Taglib php_taglib_hightlight beschriebene TagLib für das Highlighting
des PHP-Codes verwendet. Die Generierung des Menüs innerhalb der Dokumentationsseiten
wurde mit Hilfe der Klasse
doku_taglib_navigation erzeugt. Der Quelltext der TagLib
gestaltet sich wie folgt (gekürzt):
PHP-Code
class doku_taglib_navigation extends Document {
public function transform(){
// Aktuelle Seite deklarieren
$page = RequestHandler::getValue('Seite');
// Vorherige Seite deklarieren
$PreviousPage = $this->__getNeighborPageName($page);
// Nächste Seite deklarieren
$NextPage = $this->__getNeighborPageName($page,'next');
// Rückgabe-Puffer deklarieren
$Buffer = (string)'';
// Zurück-Blättern anzeigen
$Buffer .= '<strong>«</strong>';
if($PreviousPage != null){
$Buffer .= '<a href="./?Seite='.$PreviousPage.'" title="Vorherige Seite">Vorherige Seite</a>';
}
else{
$Buffer .= '<font style="color: gray;">Vorherige Seite</font>';
}
// übersicht anzeigen
$Buffer .= ' | <a href="./?Seite=Startseite" title="Startseite">Startseite</a> | ';
// Nächste Seite anzeigen
if($NextPage != null){
$Buffer .= '<a href="./?Seite='.$NextPage.'" title="Nächste Seite">Nächste Seite</a>';
}
else{
$Buffer .= '<font style="color: gray;">Nächste Seite</font>';
}
$Buffer .= ' <strong>»</strong>';
return $Buffer;
}
private function __getNeighborPageName($CurrentPage,$Type = 'previous'){
[..]
}
}
Um die TagLibrary in einem beliebigen Template einsetzen zu können muss diese zu Beginn mit
APF-Template
<core:addtaglib
namespace="sites::testapp::pres::taglib"
class="doku_taglib_navigation"
prefix="doku"
name="navigation"
/>
eingebunden werden und kann anschließend mit
APF-Template
<doku:navigation />
verwendet werden.
Da die Komplexität des DOM-Objekt-Baums der Präsentationsschicht des Adventure PHP Frameworks
nicht beschränkt ist und die Funktionalität an beliebiger Stelle durch den Einsatz von
Document-Controllern, bzw. global betrachtet, von FrontController-Actions erweitert werden kann, ist
es ohne Weiteres auf einfache Weise möglich, komplexe Projekte zu realisieren. Insbesondere das
Entwickeln von Modulen fällt hier leicht, da diese einfach per XML-Tag konfiguriert dort
eingebunden werden können, wo sie benötigt werden. Am Beispiel des mitgelieferten
Gästebuchs wird das wie folgt vorgenommen:
APF-Template
<core:importdesign
namespace="modules::guestbook::pres::templates"
template="guestbook"
guestbookid="{ID}"
/>
Dabei konfiguriert der Parameter
guestbookid die ID des an dieser Stelle auszugebenden
Gästebuchs. Vorteil dieses Verfahrens ist auch, dass eine Applikation - wie hier ein Gästebuch -
komplett unabhängig von der restlichen Webseite entwickelt und später eingebunden werden kann.
Im Adventure PHP Framework ist ein Formular konsequenter Weise "auch nur" eine TagLib, die die Funktion
erweitert. Dazu findet der Entwickler im Ordner
/apps/tools/form/taglib verschiedene
TagLibraries für jedes Formular-Element.
Jedes Formular wird durch Hinzufügen der Formular-TagLib plus der Definition des Formulars in
XML-Tags innerhalb eines Templates erzeugt. Im Gegensatz zu den bisherigen Frameworks muss der
HTML-/XML-Quellcode eines Formulars zwar von Hand geschrieben werden, jedoch können Funktionen
wie Formular-Validierung durch Definition dokumentierter Attribute aktiviert werden und es muss dazu
kein separater PHP-Code verfasst werden.
Auch in diesem Test soll ein Kontakt-Formular nach den Vorgaben der Bewertungs-Kriterien erstellt
werden. Dazu ist im vorliegenden Framework zunächst notwendig, dass ein neues Template und ein
Controller angelegt wird um das im Template definierte Formular auch darstellen zu können. Das
Template mit dem Namen
kontakt.html wird im Ordner
/apps/sites/testapp/pres/templates
abgelegt und beinhaltet folgenden Quellcode:
APF-Template
<@controller
namespace="sites::testapp::pres::documentcontroller"
class="kontakt_controller"
@>
<core:addtaglib
namespace="tools::form::taglib"
class="HtmlFormTag"
prefix="html"
name="form"
/>
<h1>Kontaktformular</h1>
Wenn Sie mit mir in Kontakt treten möchten, dann benutzen Sie einfach dieses Formular. Geben Sie
Ihre Nachricht ein und schon kann es los gehen. Ich werden mich dann umgehend mit Ihnen in Verbindung
setzten. Bitte füllen Sie das Formular vollständig aus!
<html:placeholder name="Content" />
<html:form name="Formular" method="post" action="">
<span style="width: 47px; border: 0px solid black; margin-right: 24px;">Person / Gruppe:</span>
<form:select name="Person" class="eingabe_feld">
<select:option value="1">Max Müller</select:option>
<select:option value="2">Brigitte Hansen</select:option>
</form:select>
<br />
<br />
<span style="margin-right: 82px;">Name:</span><form:text name="Name" class="eingabe_feld"
style="width: 280px;" />
<br />
<br />
<span style="margin-right: 37px;">eMail-Adresse:</span><form:text name="EMail" class="eingabe_feld"
style="width: 280px;" />
<br />
<br />
<span style="margin-right: 81px;">Betreff:</span><form:text name="Subject" class="eingabe_feld"
style="width: 280px;" />
<br />
<br />
Kommentar:
<br />
<form:text name="Text" class="eingabe_feld" style="height: 200px; width: 400px; overflow: auto;"
id="Comment" />
<br />
<br />
<form:button name="Abschicken" value="Abschicken" class="eingabe_feld" />
</html:form>
Im Controller muss nun - so geht es aus dem Beispiel aus
http://adventure-php-framework...ktFormular hervor -
das Formular transformiert und in einen Platzhalter eingesetzt werden. Dies passiert durch
PHP-Code
class ContactController extends BaseDocumentController {
public function transformContent(){
$Form = $this->getForm('Formular');
$this->setPlaceHolder('Content',$Form->transformForm());
}
}
in der Controller-Klasse
kontakt_controller in der Datei
/apps/sites/testapp/pres/documentcontroller/kontakt_controller.php. Damit ist das
Formular bereits voll funktionsfähig. Features wir Validierung und Presetting werden bereits
out-of-the-box unterstützt und können per XML-Tag-Attributen konfiguriert werden.
Um das Formular abschicken zu können muss noch eine weitere Prüfung in den Controller eingebaut
werden. Um abzufragen, ob ein Formular abgesendet, bzw. korrekt ausgefüllt wurde hat das
Formular-Objekt zwei private Attribute, die mit
get() ausgelesen und verarbeitet werden
können. Gemäß Beispiel muss der Controller damit wie folgt erweitert werden:
PHP-Code
class ContactController extends BaseDocumentController {
public function transformContent(){
$Form = $this->getForm('Formular');
if($Form->get('isSent') == true && $Form->get('isValid') == true){
header('Location: /Seite/Danke');
}
$this->setPlaceHolder('Content',$Form->transformForm());
}
}
Innerhalb des if-Anweisungs-Blocks kann dann noch die Logik des E-Mail-Versandes ergänzt werden,
was hier nicht Teil der Prüfung war bzw. ist. Beim Versand des Formulars können die Werte
der Formular-Felder mit der Komponente
RequestHandler ausgelesen werden. Dies
kann wie folgt passieren:
PHP-Code
import('tools::request', 'RequestHandler');
class ContactController extends BaseDocumentController {
public function transformContent(){
$Form = $this->getForm('Formular');
if($Form->get('isSent') == true && $Form->get('isValid') == true){
$Name = RequestHandler::getValue('Name');
$Comment = RequestHandler::getValue('Comment');
[..]
}
}
}
Um das Formular in die Seite einzubinden wurde unter
/frontend/content eine neue
Datei mit dem Namen
c_de_kontakt.html angelegt und mit der XML-Anweisung
APF-Template
<core:importdesign namespace="sites::testapp::pres::templates" template="kontakt" />
gefüllt. Bei Aufruf der URL
APF-Template
http://adventuretest.de/Seite/Kontakt
wird nun das Formular angezeigt. Legt man eine weitere Seite mit den Namen
c_de_danke.html
an, so wird auch eine Danke-Meldung angezeigt.
URL-Rewritung wird auch beim Adventure PHP Framework nativ unterstützt. Wie im Einstiegskapitel
angemerkt ist es jedoch ebenso möglich URL-Rewriting zu deaktivieren, da alle Anwendungen auch
ohne URL-Rewriting lauffähig sind, solange die dynamisch generierten Links mit dem
LinkHandler oder dem
FrontcontrollerLinkHandler im FrontController-Betrieb generiert
werden. Um die Applikationen im URL-Rewriting-Modul ausliefern zu können bringt das
Adventure PHP Framework eine in der .htaccess-Datei befindliche RewriteRule der Form
APF-Template
RewriteEngine on
RewriteCond %{REQUEST_URI} !^(\/frontend) [NC]
RewriteRule !(php|css|jpe?g|png|gif|zip|rar)$ \
/index.php?query=%{REQUEST_URI}&%{QUERY_STRING} [NC,L]
mit. Um das Feature nutzen zu können muss in der Apache-Konfiguration ein
APF-Template
AllowOverride All
für den aktuellen VHOST aktiviert, sein. Dies gilt insbesondere auch für die bisherigen
Test-Kandidaten.
Wie bereits in den vorherigen Kapiteln vorweg gegriffen, ist das URL-Layout des Adventure PHP Frameworks
an keine starren Regeln gebunden, sondern kann beliebig gestaltet werden. Im FrontController-Modus
werden dabei unterschiedliche Bereiche, in denen "normale" Parameter und FrontController-Actions
untergebracht werden durch das Zeichen "/~/" getrennt, vom
frontcontrollerRewriteRequestFilter
im URL-RewriteModus oder vom
frontcontrollerRequestFilter entsprechend ausgewertet und im
$_REQUEST-Array zur Verfügung gestellt. Im Page-Controller-Betrieb übernimmt
die Rewriting-Aufgaben der
pagecontrollerRewriteRequestFilter bzw. der
standardRequestFilter
im Fall von deaktiviertem URL-Rewriting.
Ein weiteres Feature des URL-Handlings ist die Filter-Funktion, die alle HTML- und Tag-Zeichen codiert
um XSS-Angriffe zu vermeiden. Zudem werden alle Sonderzeichen in den Request-Werten mit Slashes versehen,
so dass diese - beispielsweise in Formular-Feldern - keine Zerstückelung der Inhalte erzeugen.
Für die Verwendung der Daten beispielsweise in Suchen müssen diese dann vom Programm wieder
decodiert werden.
Der Entwickler wird beim Adventure PHP Framework angehalten, die bereits mehrfach genannten Komponenten
LinkHandler und
FrontcontrollerLinkHandler einzusetzen, wenn
es um Manipulation von URLs geht. Der
FrontcontrollerLinkHandler sollte dann eingesetzt werden,
wenn die Applikation mit dem FrontController ausgeführt wird, da dieser FrontController-Actions
in der URL beachtet. Grundsätzlich spricht jedoch nichts dagegen, immer den
FrontcontrollerLinkHandler zu verwenden, da dieser "einfache" URLs ebenso beherrscht wie
FrontController-URLs.
Innerhalb der Evaluation wurden diese Komponenten wie folgt getestet:
PHP-Code
import('tools::link','FrontcontrollerLinkHandler');
$url = 'http://www.example.com:8180/Seite/Kontakt/perspektive/print';
$params = array(
'perspektive' => '',
'Seite' => 'Danke',
'TestParam' => 'TestParamValue'
);
echo FrontcontrollerLinkHandler::generateLink($url,$params);
Ausgabe:
APF-Template
http://www.example.com:8180/Seite/Danke/TestParam/TestParamValue
Es können sowohl bestehende Parameter geändert, als auch bestehende gelöscht oder neue
hinzugefügt werden. Ähnlich verhält sich der
FrontcontrollerLinkHandler, wenn
FrontController-Actions im Spiel sind. Diese werden wie "normale" Parameter in die URL eingefügt.
Geprüft wurde hier zudem, dass Ampersands in Links automatisch codiert werden.
Das Release-Package des aktuellen Test-Kandidaten umfasst im Vergleich zu den bisherigen Frameworks
etwas weniger Module, was auch an der Strukturierung dieser gelegen sein kann. Das Adventure PHP Framework
liefert im aktuellen Release
- die Grundkomponenten des Frameworks,
- eine Demo-Seite mit vielen Beispielen
- fertige Module wie Pager, Gästebuch, Kontaktformular und
- eine Reihe von Tools
zur Unterstützung der Arbeit mit. Was das Thema Module angeht, so sind im Adventure PHP Framework
mehr fertige Applikationen (Module) enthalten als in den bisherigen Probanden. Die genannten Module
sind dabei schon recht mächtige Applikationen, wie unter
http://adventure-php-framework.org/Seite/Module beschrieben ist. Der Pager
ist dabei ein sehr treffendes Beispiel für eine Business-Komponente, die die komplette Aufgabe
des Pagings von Datenbank-Ergebnissen übernehmen kann.
Besonders zu erwähnen ist die Benchmark-Komponente, da diese bereits sehr tief im Code verwoben
ist und ohne Zutun des Programmierers zu allen wichtigen Teilen der Software Benchmarks erstellen
kann. Eine weitere herausragende Komponente ist die Implementierung des Page-Controllers, die ein
sehr generisches Design der GUI-Komponenten der Applikation zulässt. Erwähnenswert sind
in diesem Zusammenhang die mitgelieferten TagLibs. Diese bilden bereits 75% der Anwendungsfälle
ab und können out-of-the-box konfiguriert und eingesetzt werden. Weitere Beschreibungen finden
sich unter
Komponenten-Dokumentation, bzw. in den entsprechenden Kapiteln der Dokumentation.
Design-Pattern spielen auch beim Adventure PHP Framework eine herausragende Rolle. Nicht nur, dass
das Framework nach anerkannten Design-Pattern entwickelt wurde (siehe hierzu
http://adventure-php-framework...Grundlagen), sondern es bietet
auch die Grundlagen und Tools um nach oft verwendeten Design-Pattern (vgl. MVC) entwickeln zu können.
Unter Hilfsmittel fallen dabei eine "abstract singleton"-Implementierung, die Anwendung des
Fabric-Entwurfsmusters und Weiterer. Da das Framework keine native PHP 5 Version bietet, sind Konstrukte
wie Interfaces oder abstrakte Klassen nicht im Quellcode enthalten, jedoch durch das Klassendesign
fest verwoben.
Die im Framework enthaltenen Klassen erben alle von einer gemeinsamen Basis-Klasse, die die
grundlegenden Interface-Methoden und -Attribute bereits mitbringt. So kann der Entwickler immer davon
ausgehen, dass ein von
APFObject erbendes Objekt eine abstrakte
get()- und
set()-Methode hat, um private Attribute manipulieren zu können. Des weiteren führt
die Klasse
APFObject das Namespace-Handling und das initialisieren einer Klasse ein, das
in Applikationen häufig für Business- und Daten-Schicht-Komponenten zum Einsatz kommt.
Inkonzequenz kann den Entwicklern im Bereich der Klassenbenennung vorgeworfen werden, da hier eine
Mixtur aus CamelCase- bzw. "Alles klein"-Schreibweise je nach Bestimmung der Klasse propagiert wird.
Die Struktur des Quellcodes ist per-se ist mit gut zu bewerten, da für jedes Package eine Struktur
im Ordner-Baum angelegt wurde, bzw. der Quell-Code der mitgelieferten Komponenten sehr gradlinig und
konsequent aufgebaut ist, was den Blick in den Quellcode - falls notwendig - erleichtert.
Das Adventure PHP Framework bringt mit der Namespace- und Context-Behandlung ein sehr mächtiges
Werkzeug mit um Applikationen, die den Design-Richtlinien des Frameworks genügen, in vielen
verschiedenen Applikationen und Umfeldern einsetzen zu können. Die Konfigurations-Direktive
APPS__ENVIRONMENT bestimmt bereits in der Basis-Konfigurationsdatei in welchem Umfeld die
Applikation ausgeführt wird. Um eine Applikation leichter auf ein anderes System portieren zu
können, ist es dabei lediglich notwendig dafür einen Satz von Konfigurationsdateien anzulegen
und die Direktive auf einen anderen Wert zu setzen.
Des Weiteren erhält jede Applikation einen Namespace (=Ablage-Ort der Programm- oder Modul-Dateien)
und einen Kontext, der über die Applikation (=Webseite) gesteuert wird. Diese drei
Unterscheidungsmerkmale helfen dem Entwickler universell wiederverwendbare Applikationen und Module
zu verfassen. Etwas gewöhnungsbedürftig ist dabei jedoch die Benennung der
Konfigurationsdateien, da diese sowohl unter dem richtigen Namespace und der richtigen Kontext-Struktur
abgelegt und mit dem für das Umfeld richtigen Dateinamen benannt sein müssen. Eine Beschreibung
hierzu liefert
http://adventure-php-framework...figuration. Die
Fehler-Meldungen des
ConfigurationManager's sind dabei jedoch sehr ausführlich abgefasst
und bieten Hinweise auf das Problem.
Interessierte Programmierer können das Framework beliebig erweitern, da eine sehr generische
Grund-Struktur vorhanden ist. Besonders im GUI-Bereich ist es möglich beliebige Erweiterungen
zu implementieren um die Ausgabe eines Projektes nach dem Geschmack des jeweiligen Entwicklers zu
gestalten. Aber nicht nur in der Präsentationsschicht, auch in den übrigen Bereichen ist
es mit dem Design des Adventure PHP Frameworks ohne Probleme möglich Erweiterungen zu verfassen.
Ein Rapid Development Feature im Sinne von CakePHP und CodeIgniter ist nicht enthalten und laut Roadmap
bis jetzt nicht vorgesehen. Für den Zugriff auf Datenbanken ist zwar eine generische Komponente
(leider nur für MySQL) vorhanden, Pattern wie Table-Data-Gateway oder Row-Data-Gateway sind nicht
implementiert. Aus Sicht des Autors ist dieses - wie auch beim Zend Framework - nicht Teil der
aktuellen Strategie. Diese Komponenten können bei Bedarf jedoch einfach als Module hinzugefügt
werden.
Der Quellcode des Frameworks ist sehr gut dokumentiert. Einziger Nachteil ist, dass die Dokumentation
nur in deutscher Sprache vorhanden ist.
Die API-Dokumentation des Frameworks ist jeweils abhängig von der Version unter
http://adventure-php-framework.org/Seite/Downloads verfügbar.
Einführungen, Tutorials und Anwendungs-Beispiele
Leider verfügt das Adventure PHP Framework nicht über ein Wiki in das verschiedene
Entwickler ihre Erfahrungen und Code-Snippets posten können. Die übrigen Anwendungsbeispiele
verraten jedoch sehr viel über die Verwendung und die Anwendung des Frameworks. Einsteiger erhalten
mit dem Webseiten-Tutorial unter
http://adventure-php-framework...eErstellen
einen einfachen Einstieg in den Webseitenbau. Angenehm fällt auf, dass die Anwendungsbeispiele
immer einen Bezug zur Praxis aufweisen.
Ein einfaches ChangeLog ist in den Release-Notes eingearbeitet, ein erweitertes gibt es unter
http://adventure-php-framework.org/Seite/ChangeLog.
3.4.8. Support
Da das Adventure PHP Framework nicht den kommerziellen Hintergund wie die bisherien Test-Kandidaten
aufweist, ist der Support nicht so "exzellent" aufgestellt und es ist kein "Enterprise-Bezahl-Support"
möglich. Hinter dem Framework steckt ein OpenSource-Projekt ohne hauptamtliche Entwickler. Support
erhält der Anwender daher nur auf der Seite selbst, durch das Manual und die API-Dokumentation,
per Kontakt-Formular und im PHPFriend.de-Forum unter
http://www.phpfriend.de/forum.
Charmant ist es jedoch, dass man mit Hilfe des Kontakt-Formulars und einem Post im Forum direkten
Zugriff auf die Entwicklung hat. Zum aktuellen Zeitpunkt ist zudem noch kein WIKI verfügbar, in
dem Benutzer Tipps und Tricks oder Ihre Erfahrungen veröffentlichen können. Alternativ dazu
befindet sich am Ende jeder Dokumentationsseiten eine Kommentarfunktion, die als solches Instrument
genutzt werden kann.
3.4.9. Benchmark
Das Benchmark-Ergebnis ist im Vergleich zu den übrigen Test-Kandidaten hervorragend gut.
Während der bisherige Favorit CakePHP die Benchmark-Seite in
0.1134 s gerendert
hat benötigt das Adventure PHP Framework trotz komplexerer GUI-Engine nur etwas mehr als ein Drittel
und kommt auf eine durchschnittliche Zeit von
0.0428 s. Zur Messung wurde auch
hier der im Framework integrierte
BenchmarkTimer verwendet und die Benachmark-Seite
mit
APF-Template
http://adventuretest.de/Seite/Benchmark/benchmarkreport/true
aufgerufen.
» Weiter auf
Seite 7 (Zusammenfassung).
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.
Für diesen Artikel liegen aktuell keine Kommentare vor.