Filter
Das Thema "Filter" spielt im Adventure PHP Framework eine zentrale Rolle. In den Releases
inkl. 1.8 wurden diese bereits versteckt für die Sicherung der Ein- und Ausgaben genutzt, ab
dem 1.9er-Zweig können diese vom Benutzer direkt beeinflusst und über die Registry verwaltet
werden. Weiterhin stehen nun Filter für Formularfelder zur Verfügung, die zusätzlich
zu den Ein- und Ausgabe-Filtern zur Sicherung der Benutzereingaben verwendet werden können.
Die Klasse der Eingabe-Filter kümmern sich um die Auswertung der Benutzereingaben der in der
URL und der im HTTP-Protokoll eingebetteten Inhalte (aka POST-Daten). Dazu sind im Framework bereits
vier allgemeingültige Filter-Typen enthalten, die sich um die Verarbeitung von Benutzer-Eingaben
mit und ohne Rewrite-URLs kümmern.
Da der Kern des Frameworks selbst keine Kenntnis vom URL-Layout hat, sondern ausschließlich
mit dem
$_REQUEST-Array arbeitet, ermöglichen erst die Filter ein so generisches
Rewrite-URL-Layout.
Die Filter gliedern sich in die folgenden Bereiche:
Der einfachste Typ wird beim Einsatz des PageControllers im normalen URL-Modus verwendet. Der
StandardRequestFilter aus dem Namespace
core::filter::input
ersetzt die eingegebenen Werte durch ihre HTML-codierten Entsprechungen (siehe
htmlspecialchars())
und führt ein
stripcslashes()
aus, falls die Option
magic_quotes_gpc auf den Wert
1 gesetzt wurde um Inhalte in
Formularen korrekt darstellen zu können.
Die Entgegennahme der Benutzer-Eingaben im Fall von Rewrite-URLs übernimmt der Filter
PagecontrollerRewriteRequestFilter aus dem Namespace
core::filter::input.
Dieser zerlegt die Rewrite-URL in seine Bestandteile und generiert aus diesen die Inhalte des
$_REQUEST-Arrays neu. Der Filter geht dabei davon aus, dass die umgeschriebenen URLs eine
Folge von durch "/" getrennte Parameter-Wert-Paare enthalten. Anschließend wird der
StandardRequestFilter ausgeführt um die Eingaben zu sichern.
Der FrontController-Filter für Standard-URLs analysiert den Request, extrahiert die
FrontController-Anweisungen und registriert die Actions beim FrontController. Normale Parameter
werden identisch zu den beiden vorangegangenen Filtern mit den
StandardRequestFilter
behandelt. Hierfür zeichnet sich der
FrontcontrollerRequestFilter aus dem
Namespace
core::filter::input verantwortlich.
Ähnlich dem
PagecontrollerRewriteRequestFilter filtert der
FrontcontrollerRewriteRequestFilter aus dem Namespace
core::filter::input
die Eingaben bei Nutzung des Frontcontrollers in Verbindung mit Rewrite-URLs. Dabei werden ebenfalls
die umgeschriebenen Action-Anweisungen und die normalen Parameter aus der URL extrahiert, in das
$_REQUEST-Array gespeichert und die Actions an den Frontcontroller übergeben.
Die Ausgabe-Filter kümmern sich um die Formatierung des erzeugten HTML-Codes. Da hier keine
Unterscheidung zwischen Front- und PageController notwendig ist, beinhaltet das APF nur einen
Ausgabe-Filter, der sich im Fall von aktiviertem URL-Rewriting um das Umschreiben der Links und
Formular-Actions kümmert. Diese Aufgabe übernimmt der
HtmlLinkRewriteFilter
aus dem Namespace
core::filter::output. Um Links explizit davon auszunehmen, kann
das Link-Attribut
linkrewrite auf den Wert
false gesetzt werden.
mailto:-Links werden ab Release 1.10 automatisch ausgenommen.
Der mit dem APF mitgelieferte
OutputFilter (Klasse:
GenericOutputFilter)
nutzt den
XmlParser des APF zur Analyse der HTML-Links. Aus diesem Grund ist es
notwendig, dass die Attribute alle Links mit >>"<< umschlossen sind und keine
TAB-Zeichen enthalten. Ist das nicht der Fall kann es zum Endlos-Schleifen-Effekt
kommen, der im Forum unter
99% CPU-Last bei aktiviertem UrlRewriting
beschrieben wurde.
Ein Filter im Adventure PHP Framework wird durch eine Klasse, die von
AbstractFilter
ableitet, repräsentiert. Diese muss die Methode
filter() implementieren, die
ein Argument trägt: den
Input. Am Ende der Funktion muss
der
Output zurückgegeben werden.
In der folgenden Code-Box wird ein Beispiel beschrieben:
PHP-Code
class MySpecialFilter extends AbstractFilter {
public function filter($input){
return $this->__replaceAWithB($input);
}
private function __replaceAWithB($string){
return str_replace('a','b',$input);
}
}
Um einen Filter nutzen zu können, muss dieser über die
FilterFactory
erzeugt werden. Die Methode
getFilter() erwartet ein
FilterDefinition-Objekt als Parameter. Die
FilterDefinition
beinhaltet dabei den Namespace und den (Klassen- bzw. Datei-)Namen des Filters.
Das folgende Beispiel zeigt die Verwendung eines Filters:
PHP-Code
// define the filter
$filterDef = new FilterDefinition('my::filter::namespace','MySpecialFilter');
// create the filter
$filter = FilterFactory::getFilter($filterDef);
// gather the input
$input = /* ... */
// apply the filter
$output = $filter->filter($input);
Der interne Aufbau eines Filters ist dabei komplett dem Entwickler überlassen.
Details zu den enthaltenen Standard-Filtern kann der API-Dokumentation der jeweiligen Version unter
Downloads entnommen werden.
Die Konfiguration der Ein- und Ausgabe-Filter wird über die Registry gesteuert. Hierzu existieren
folgende Registry-Einträge im Namespace
apf::core::filter:
-
PageControllerInputFilter: wird bei Verwendung des PageControllers beim
Erstellen des Page-Objekts ausgeführt.
-
FrontControllerInputFilter: wird bei Verwendung des FrontControllers beim
Starten ausgeführt. Inkludiert die Funktionen des PageControllerInputFilter
hinsichtlich URL-Rewriting.
-
OutputFilter: Wird bei der Transformation der PageController-Seite auf den
generierten Quelltest angewendet.
Möchte der Entwickler sein eigenes URL-Layout definieren, so kann dies durch einen eigenen Filter
abgebildet werden, der als Page- oder FrontController-Input-Filter definiert wird. Da die Konfiguration
über die Registry erfolgt, kann dies in der Bootstrap-Datei vorgenommen werden. Die folgende
Code-Box zeigt, wie die Konfiguration vorgenommen für den PageController werden kann:
PHP-Code
// include page controller
include('./apps/core/pagecontroller/pagecontroller.php');
// configure registry
Registry::register(
'apf::core::filter',
'PageControllerInputFilter',
new FilterDefinition('my::filter::namespace','MyPageControllerInputFilter')
);
// create page and display page
$page = new Page();
$page->loadDesign('namespace::of::my::webpage','mytemplate');
echo $page->transform();
Im Fall des FrontControllers erfolgt die Anpassung wie folgt:
PHP-Code
// include page controller
include('./apps/core/pagecontroller/pagecontroller.php');
// include front controller
import('core::frontcontroller','Frontcontroller');
// configure registry
Registry::register(
'apf::core::filter',
'FrontControllerInputFilter',
new FilterDefinition('my::filter::namespace','MyFrontControllerInputFilter')
);
// create front controller and start it
$fC = &Singleton::getInstance('Frontcontroller');
$fC->start('namespace::of::my::webpage','mytemplate');
Wichtig: die Konfiguration muss
vor dem Erzeugen des Page- bzw. FrontControllers
erfolgen!
Die Manipulation des Ausgabe-Filters gestaltet sich identisch zu den beiden vorherigen Beispielen.
Hier muss jedoch der Registry-Eintrag
OutputFilter mit einer neuen
FilterDefinition
belegt werden.
Falls keine Filterung erwünscht ist, können die oben aufgezeigten Konfigurationsdirektiven
mit
null belegt werden:
PHP-Code
// include page controller
include('./apps/core/pagecontroller/pagecontroller.php');
// include front controller
import('core::frontcontroller','Frontcontroller');
// disable all filters (or just parts of it)
Registry::register('apf::core::filter','PageControllerInputFilter',null);
Registry::register('apf::core::filter','FrontControllerInputFilter',null);
Registry::register('apf::core::filter','OutputFilter',null);
...
Aufbauend auf der oben gezeigten Definition von Filtern existieren Seit dem 1.9er-Branch auch Filter
für Formular-Felder. Die Verwendung und Anpassung der Filter wird im Kapitel
Verwendung von Formular-Filtern
erläutert.
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.
Für diesen Artikel liegen aktuell keine Kommentare vor.