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;
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é.
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)));
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}/' )));