# 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 :

    $route = new Zend_Controller_Router_Route(
        'auteur/:username',
        array(
            'controller' => '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 :

    $values = array(
        'username'   => '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()` :

    public function userinfoAction()
    {
        $request = $this->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" :

    $route = new Zend_Controller_Router_Route(
        ':module/:controller/:action/*',
        array('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 :

    $route = new Zend_Controller_Router_Route(
        'archive/:annee',
        array('annee' => 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 :

    $route = new Zend_Controller_Router_Route(
        'archive/:annee',
        array(
            'annee'       => 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 :

    $route = new Zend_Controller_Router_Route(
        'archive/:annee',
        array(
            'annee'       => 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.