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.