Monday, November 20. 2006ZendFramework: Actions mit Endung
Wie ich bereits mehrere male schrieb, gefällt mir das ZendFramework sehr gut. Besonders das Model-View-Controller-Konzept ist sehr schön realisiert. Heute möchte ich mal eine kleine Anleitung zum Zend_Controller_Dispatcher veröffentlichen.
Der Dispatcher wird dazu benötigt, die passenden Controller und Actions zur aufgerufenen URL zu finden und zu laden (um das mal einfach zu erklären
Bei der URL http://www.fadoe.de/ wird der IndexController mit der indexAction() geladen, genauso wie bei den URLs http://www.fadoe.de/index und http://www.fadoe.de/index/index. Bei http://www.fadoe.de/index/hallo wird im IndexController die halloAction() aufgerufen, wohingegen bei http://www.fadoe.de/foo die indexAction beim FooController und bei http://www.fadoe.de/foo/bar die barAction beim FooController aufgerufen wird. Wer nicht versteht was ich meine, sollte nun doch einmal ins Handbuch zum ZendFramework schauen Nun aber zu meiner Aufgabenstellung: Die Actions sollen beim Aufruf jeweils mit Dateiändung ".html" versehen werden, was in meinen oberen Beispielen so aussähe: Um dies zu bewerkstelligen muss man den Dispatcher anpassen. Ich habe mir dazu eine eigene Ordnerstruktur angelegt, die wie folgt aussieht: Da die Ordnerstruktur bis zur PHP-Datei jeweils eine Klasse wiederspiegelt, werde ich in Zukunft von FaDoe_Controller_Dispatcher (für FaDoe/Controller/Dispatcher.php) und FaDoe_Controller_Dispatcher_Html (für FaDoe/Controller/Dispatcher/Html.php) sprechen. Schauen wir uns als erstes die Klasse FaDoe_Controller_Dispatcher an. Da ich nur eine einzige Methode abändern muss, und zwar die _formatName(), habe ich meinen Dispatcher vom Zend-Dispatcher abgeleitet. Aber warum habe ich diese Abstrakt gemacht? Weil ich leider (noch) keine Möglichkeit gefunden habe, einem Dispatcher Konfigurationsvariablen mitzugeben, in meinem Fall die Dateiändung, die jeweils abgeschnitten werden soll. Deshalb muss ich für jede Dateiändung (.html, .htm, .php, ...) eine eigene Klasse ableiten, in der einfach nur die Extension steht. Weiter unten mehr. Wie ich schon erwähnte, muss die Methode _formatName() angepasst werden. Diese ist für das umwandeln eines URL-Teilstückes in einen Namen für eine Action bzw. Controller-Klasse zuständig. Ein Blick in den Quelltext der Klasse Zend_Controller_Dispatcher lohnt sich, um die genaue Anwendung zu verstehen. Ich habe nun diese Funktion überladen und einfach eine Variable $pattern hinzugefügt, die die Dateiändung als regulären Ausdruck zusammenbaut und dann mit preg_replace() die Dateiändung von der übergebenen Zeichenkette entfernt. Anschließend kann ich nun dem Zend-Dispatcher das weitere formatieren der Zeichenkette überlassen (return parent::_formatName($unformatted)). Im Prinzip war das schon die ganze Zauberei. Als letztes werfen wir noch einen Blick auf FaDoe_Controller_Dispatcher_Html. Unserem Dispatcher fehlt ja immerhin noch die Dateiändung, die er wegschneiden soll. Wir leiten also FaDoe_Controller_Dispatcher_Html von FaDoe_Controller_Dispatcher ab und setzen eine protected-Variable $_extension auf 'html' (oder jede andere Dateiändung; wie wäre es mal mit jsp [Java Server Pages]?). Für jede Dateiändung wird eine neue Datei geschrieben, die genauso heißt wie die Dateiändung, die abgeschnitten werden soll. In der Bootstrap-Datei, in der wir den Zend_Controller_Front aufrufen, sieht das dann wie folgt aus: Von nun an kann man die Webseiten nicht nur über ansprechen, sondern zusätzlich auch unter .Wer ersteres noch verhindern möchte, der muss zusätzlich die Methode formatActionName() anpassen/überladen und dort eine andere Methode _formatName() einfügen, die abfragt, ob am Ende die Dateiändung vorhanden ist. Oder man sucht sich eine andere passende Stelle, oder baut sich einen ganz eigenen Dispatcher zusammen. Das passendene Interface wird auch mitgeliefert (Zend_Controller_Dispatcher_Interface). Ich wünsche viel Spaß beim weiteren experimentieren. Trackbacks
Trackback specific URI for this entry
No Trackbacks
|
KategorienBlog abonnierenBlog Administration |