Wie man Pfad-Routen in der application.ini definiert ist recht “gut” dokumentiert in der Dokumentation des Zend-Controllers (Router) – wobei gut auch dort nicht ganz richtig ist. Irgendwie wirkt die Dokumentation des Frameworks auf mich immer ein wenig wie eine Snippet-Sammlung – sprich: Man wird in den Kontext reingeworfen und versucht rudernd nicht im Meer des Missverstehens unterzugehen.
Wie dem auch sei. In der Dokumentation findet man “prima” beschrieben, wie man das ganze in der Bootstrap.php z.B. löst:
// Erstellung zweier Routen
$hostnameRoute = new Zend_Controller_Router_Route_Hostname(...);
$pathRoute = new Zend_Controller_Router_Route(...);
// Erster Weg, mit Verkettung über die Chain Route
$chainedRoute = new Zend_Controller_Router_Route_Chain();
$chainedRoute->chain($hostnameRoute)
->chain($pathRoute);
// Zweiter Weg, direkt verketten
$chainedRoute = $hostnameRoute->chain($pathRoute);
Ich würde das ganze ja noch um folgendes ergänzen: Zum einen sollte man das ganze in eine protected _initRouter()-Methode packen und zum anderen folgendes davor bzw. danach hinzufügen – nur um den Kontext abzurunden versteht sich
.
$this->router = $this->frontController->getRouter();
$this->router->removeDefaultRoutes();
[... Code von oben ...]
$this->router->addRoute('verySpecialNameOfRoute', $chainedRoute);
Ja ich weiß kann man alles auch noch viel besser zusammenfassen, aber so kann man es nu besser erkennen. Darauf wollte ich aber eigentlich ja nicht hinaus wie ich schon weiter oben schrob geht es mir mehr um die Implementierung bzw. Definition der Verkettung einer Hostname- mit einer Pfad-Route.
Nun alle Routen in der Bootstrap.php zu definieren ist zwar ohne weiteres möglich – ich persönlich halte allerdings nicht sehr viel davon. Zumal eine ordentlich kommentierte und genutzte .ini-Datei für die meisten pflegbar ist und nicht lediglich für solche, die PHP verstehen.
Wie wir das ganze über die Zend_config mit der Definition eines Arrays lösen finden wir auch halbwegs brauchbar in der Dokumentation des Controllers bzw. des Routers der Teil des selbigen ist. Gut es wird hier kein Beispiel für den Zend_Controller_Router_Route_Hostname in Zusammenhang mit der Verkettung des selbigen mit einer Pfad-Route (Zend_Controller_Router_Route z.B.) gegeben aber immerhin werden hier zwei Routen verkettet und man kann das ja dann ohne weiteres ableiten.
$config = new Zend_Config(array(
'chainName' => array(
'type' => 'Zend_Controller_Router_Route_Static',
'route' => 'foo',
'chains' => array(
'subRouteName' => array(
'type' => 'Zend_Controller_Router_Route_Static',
'route' => 'bar',
'defaults' => array(
'module' => 'module',
'controller' => 'controller',
'action' => 'action'
)
)
)
)
));
Wie schon erwähnt, es sind zwei Pfad-Routen, die da verknüpft werden, aber es wird bestimmt fast jeder in der Lage sein die Zend_Controller_Router_Route_Static in eine für den Fall benötigte Zend_Controller_Router_Route_Hostname umzuwandeln (Tipp: Daran denken die “route” auf den richtigen Wert zu setzen
). Gut! Nun aber zur .ini: Das Zend Framework bzw. die Dokumentation des Frameworks bietet uns folgendes für die .ini an:
routes.archive.route = "archive/:year/*"
routes.archive.defaults.controller = archive
routes.archive.defaults.action = show
routes.archive.defaults.year = 2000
routes.archive.reqs.year = "\d+"
routes.news.type = "Zend_Controller_Router_Route_Static"
routes.news.route = "news"
routes.news.defaults.controller = "news"
routes.news.defaults.action = "list"
routes.archive.type = "Zend_Controller_Router_Route_Regex"
routes.archive.route = "archive/(\d+)"
routes.archive.defaults.controller = "archive"
routes.archive.defaults.action = "show"
routes.archive.map.1 = "year"
; OR: routes.archive.map.year = 1
und:
$config = new Zend_Config_Ini('/path/to/config.ini', 'production');
$router = new Zend_Controller_Router_Rewrite();
$router->addConfig($config, 'routes');
Öhm?! Ja… Eben ging es noch um die Verkettung von Routen und jetzt werden hier drei der Standards definiert, aber keinerlei Hinweis auf eine Verkettung?! Komplett aus dem Kontext des vorhergegangen heraus. Prima. Um es kurz zu machen: Man kann das ganze von der Definition mir Hilfe des Arrays ableiten.
# router settings - start
[routes]
# default routes regular website - start
# hostname route
routes.defaultHost.type = "Zend_Controller_Router_Route_Hostname"
routes.defaultHost.route = "sub.domain.tld"
# longterm
routes.defaultHost.chains.longterm.type = "Zend_Controller_Router_Route"
routes.defaultHost.chains.longterm.route = ":city/long-term-forecast"
routes.defaultHost.chains.longterm.defaults.controller = "index"
routes.defaultHost.chains.longterm.defaults.action = "longtermForecast"
routes.defaultHost.chains.longterm.defaults.city = null
# contact
routes.defaultHost.chains.contact.type = "Zend_Controller_Router_Route"
routes.defaultHost.chains.contact.route = "contact/*"
routes.defaultHost.chains.contact.defaults.controller = "contact"
routes.defaultHost.chains.contact.defaults.action = "index"
# default routes regular website - end
# default routes mobile website - start
# hostname route
routes.mobileHost.type = "Zend_Controller_Router_Route_Hostname"
routes.mobileHost.route = "m.domain.tld"
routes.mobileHost.chains.longterm.type = "Zend_Controller_Router_Route"
routes.mobileHost.chains.longterm.route = ":city/long-term-forecast"
routes.mobileHost.chains.longterm.defaults.controller = "mobile"
routes.mobileHost.chains.longterm.defaults.action = "longtermForecast"
routes.mobileHost.chains.longterm.defaults.city = null
Das ganze ist nur ein Auszug aus der Definition die ich für eines unserer Projekte vorgenommen habe. Funktioniert aber ganz wunderbar und lässt sich so vor allem prima warten/pflegen.
Nur damit keine Missverständnisse aufkommen: Ich mag das Zend Framework und ich finde die meisten Sachen wirklich gut gelöst – schreibe ja auch was dazu (Beispielsweise zu hybriden Models mit/trotz Zend_Db_Table_Abstract) – nur halt die Doku ist ein wenig für den A***h
Tags: Controller, Frameworks, PHP5, Router, Zend //
Erste Meinung dazu »