Zend_Controller_Router_Route Zend_Controller_Router_Route est la route par défaut intégrée dans le routeur de réécriture (RewriteRouter). Ce routeur combine les deux avantages que sont la simplicité d'utilisation et la flexibilité. Chaque route est définie par une correspondance d'URL, statique ou dynamique, et des valeurs par défaut peuvent être fournies, de même que des valeurs obligatoires. Imaginons une application ayant besoin de posséder une page en décrivant l'auteur. Nous voulons que lorsque le navigateur pointe vers http://domaine.fr/auteur/martel, la page d'informations en question puisse apparaître, au sujet de "martel". La route pour une telle URL pourrait être : 'profile', 'action' => 'userinfo' ) ); $router->addRoute('user', $route); ]]> Le premier paramètre du constructeur de Zend_Controller_Router_Route est la définition de la route à analyser avec l'URL. Les définitions des routes sont des parties statiques et dynamiques, séparées par des slashs ("/"). Les parties statiques sont juste du texte brut : auteur. Les dynamiques, appelées variables, sont repérées grâce à un caractère deux-points (:) devant la variable : :username. Utilisation des caractères Pour identifier une variable dans un schéma de routage (après le deux-points), en théorie n'importe quel caractère fait l'affaire (sauf le slash "/"). Cependant il est conseillé de n'utiliser que des caractères que PHP comprend comme étant des noms de variables valides. Les implémentations futures de ce comportement peuvent changer, altérant ainsi votre code. Cette route exemple devrait être utilisée lorsque le navigateur pointe vers http://domaine.fr/auteur/martel, et dans un tel cas, tous les paramètres de la requête seront injectés dans l'objet Zend_Controller_Request et seront accessibles à travers votre ProfileController. Les variables retournées par cet exemple peuvent être représentées par le tableau suivant : 'martel', 'controller' => 'profile', 'action' => 'userinfo' ); ]]> Plus tard, Zend_Controller_Dispatcher_Standard va distribuer vers la méthode userinfoAction() de ProfileController (dans le module par défaut) selon ces valeurs. A cet endroit, il sera possible d'accéder à toutes les variables de la requête grâce à Zend_Controller_Action::_getParam() ou Zend_Controller_Request::getParam() : getRequest(); $username = $request->getParam('username'); $username = $this->_getParam('username'); } ]]> La définition des routes peut contenir un ou plusieurs caractères spéciaux - des jokers - représentés par le symbole '*'. Il est utilisé pour collecter des paramètres. L'exemple suivant représente plus ou moins le comportement par défaut de la route "Module" : 'default') ); $router->addRoute('default', $route); ]]> Variables par défaut Chaque variable dynamique dans la définition des routes peut avoir une valeur par défaut. C'est à cela que sert le second paramètre du constructeur de Zend_Controller_Router_Route. Il s'agit d'un tableau avec comme clés les noms des variables, et comme valeurs, leurs valeurs par défaut : 2006) ); $router->addRoute('archive', $route); ]]> L'exemple ci-dessus établira une correspondance avec les URL comme http://domaine.fr/archive/2005 et http://exemple.fr/archive. Dans ce dernier cas, la variable de l'année (annee) aura la valeur 2006. L'exemple ci-dessus injecte ainsi un paramètre représentant une année (annee). Si aucune information de contrôleur ou d'actions n'est présente, alors ceux par défaut seront utilisés (ils sont définis dans Zend_Controller_Dispatcher_Abstract). Pour que l'exemple soit plus intuitif, spécifions des paires contrôleur et action par défaut dans notre route : 2006, 'controller' => 'archive', 'action' => 'show' ) ); $router->addRoute('archive', $route); ]]> Cette route va alors donner une distribution vers la méthode showAction() de ArchiveController. Obligations et contraintes des variables Vous pouvez ajouter un troisième paramètre au constructeur de Zend_Controller_Router_Route pour spécifier une variable obligatoire. Ceci s'effectue au moyen d'expressions régulières : 2006, 'controller' => 'archive', 'action' => 'show' ), array('year' => '\d+') ); $router->addRoute('archive', $route); ]]> Avec une telle définition de route, comme ci-dessus, le routeur n'établira une correspondance que si la variable "annee" contient une donnée numérique : http://domaine.fr/archive/2345. Une URL comme http://exemple.annee/archive/test ne sera pas captée (matchée) par cette route, et le contrôle sera passé à la route suivante, etc. Translated segments The standard route supports translated segments. To use this feature, you have to define at least a translator (an instance of Zend_Translate) via one of the following ways: Put it into the registry with the key Zend_Translate. Set it via the static method Zend_Controller_Router_Route::setDefaultTranslator(). Pass it as fourth parameter to the constructor. By default, the locale specified in the Zend_Translate instance will be used. To override it, you set it (an instance of Zend_Locale or a locale string) in one of the following ways: Put it into the registry with the key Zend_Locale. Set it via the static method Zend_Controller_Router_Route::setDefaultLocale(). Pass it as fifth parameter to the constructor. Pass it as @locale parameter to the assemble method. Translated segments are separated into two parts. Fixed segments are prefixed by a single @-sign, and will be translated to the current locale when assembling and reverted to the message ID when matching again. Dynamic segments are prefixed by :@. When assembling, the given parameter will be translated and inserted into the parameter position. When matching, the translated parameter from the URL will be reverted to the message ID again. Message IDs and separate language file Occasionally a message ID which you want to use in one of your routes is already used in a view script or somewhere else. To have full control over safe URLs, you should use a separate language file for the messages used in the route. The following is the simplest way to prepare the standard route for translated segment usage: 'array', 'content' => array(), 'locale' => 'en' ) ); $translator->addTranslation( array( 'content' => array( 'archive' => 'archiv', 'year' => 'jahr', 'month' => 'monat', 'index' => 'uebersicht' ), 'locale' => 'de' ) ); // Set the current locale for the translator $translator->setLocale('en'); // Set it as default translator for routes Zend_Controller_Router_Route::setDefaultTranslator($translator); ]]> This example demonstrates the usage of static segments: 'archive', 'action' => 'index' ) ); $router->addRoute('archive', $route); // Assemble the URL in default locale: archive $route->assemble(array()); // Assemble the URL in german: archiv $route->assemble(array()); ]]> You can use the dynamic segments to create a module-route like translated version: 'index', 'action' => 'index' ) ); $router->addRoute('archive', $route); // Assemble the URL in default locale: archive/index/foo/bar $route->assemble(array('controller' => 'archive', 'foo' => 'bar')); // Assemble the URL in german: archiv/uebersicht/foo/bar $route->assemble(array('controller' => 'archive', 'foo' => 'bar')); ]]> You can also mix static and dynamic segments: 'year' 'value' => 2005, 'controller' => 'archive', 'action' => 'show' ), array('mode' => '(month|year)' 'value' => '\d+') ); $router->addRoute('archive', $route); // Assemble the URL in default locale: archive/month/5 $route->assemble(array('mode' => 'month', 'value' => '5')); // Assemble the URL in german: archiv/monat/5 $route->assemble(array('mode' => 'month', 'value' => '5', '@locale' => 'de')); ]]>