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 contrôleur/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.