====== Le routing ======
Le système de routing de Stato vous offre la possibilité de faire de l'URL rewriting en PHP, c'est à dire de faire correspondre une requête entrante à un contrôleur et une action. Les routes sont définies dans le fichier ''conf/routes.php''. A l'ouverture de ce fichier, vous trouverez le code suivant :
$map = new SRouteSet();
$map->connect(':controller/:action/:id');
return $map;
Cette route par défaut spécifie qu'une requête est constituée d'un '':controller'' suivi d'une '':action'' à laquelle on fournit un '':id''.
Si par exemple la requête est ''posts/edit/12'', elle correspond aux paramètres suivants :
$params = array(
'controller' => 'posts',
'action' => 'edit',
'id' => '12'
);
Notez bien que toutes les routes n'ont pas la même priorité : cette priorité est définie par leur ordre d'apparition, du haut vers le bas (la plus haute est donc prioritaire sur toutes les autres).
En pratique donc, vous avez tout intérêt à laisser en dernière position la route par défaut :
$map = new SRouteSet();
$map->connect('', array('controller' => 'posts', 'action' => 'list'));
$map->connect(':controller/:action/:id');
return $map;
===== Paramètres par défaut =====
Le deuxième argument de la méthode ''connect'' vous permet de définir des paramètres par défaut. Il est donc très facile de définir un contrôleur par défaut pour votre application :
$map = new SRouteSet();
$map->connect(':controller/:action/:id', array('controller' => 'posts'));
return $map;
Notez que si vous ne précisez pas d'action par défaut, ''index'' sera utilisé.
===== Routes nommées =====
Vous pouvez remplacer la méthode ''connect'' par le nom que vous souhaitez donner à votre route. Par exemple :
$map = new SRouteSet();
$map->home('', array('controller' => 'posts', 'action' => 'list'));
$map->connect(':controller/:action/:id');
return $map;
Vous disposerez ainsi dans vos contrôleurs et vues d'une fonction ''home_url()'' référençant votre route :
$this->redirect_to(home_url());
Des arguments peuvent être passés à ces fonctions :
$this->redirect_to(show_post_url(array('id' => 12)));
Vous pouvez aussi leur passer une instance d'une classe métier, pour que l'id de cette instance soit utilisée comme paramètre :
link_to($this->post->title, show_post_url($this->post));
// ce qui équivaut à :
link_to($this->post->title, show_post_url(array('id' => $this->post->id)));
===== Paramètres et expressions régulières =====
Vous pouvez utiliser une expression régulière pour préciser le format attendu pour un paramètre :
$map->connect('posts/:year/:month/:day', array(
'controller' => 'posts',
'action' => 'show_by_date',
'requirements' => array(
'year' => '/\d{4}/',
'month' => '/\d{1,2}/',
'day' => '/\d{1,2}/'
)));
Cette route, vous l'aurez compris, permet de répondre à des requêtes du type ''posts/2007/01/20''. Sans l'option ''requirements'', notre route serait trop générale et elle répondrait également à des requêtes du type ''posts/edit/12''.
Nous pouvons d'ailleurs l'améliorer de façon à ce qu'elle réponde également à des requêtes du type ''posts/2007'' ou ''posts/2007/01'' :
$map->connect('posts/:year/:month/:day', array(
'controller' => 'home',
'action' => 'show_by_date',
'month' => null,
'day' => null,
'requirements' => array(
'year' => '/\d{4}/',
'month' => '/\d{1,2}/',
'day' => '/\d{1,2}/'
)));