MVC – Mettre en place un routeur URLs en PHP
Des URLs élégantes sont un des détails importants au niveau de la qualité d’une application Web.
On connaît tous rewrite d’apache pour gérer ses urls,
mais dans cet article je vous propose de voir une solution parmi d’autres pour gérer de belles urls via PHP.
Vous pouvez lire cet article intéressant du W3C écrit par Tim Berners-Lee W3C Cool URIs don’t change
Donc pour notre routeur, nous avons besoin d’un fichier de configuration,
celui-ci possède les règles nécessaires pour faire correspondre une url en particulier avec un controleur.
-
[*]
-
url = "/hello.html";
-
script = HelloWorld
-
type = static
Le code présenté sert d’illustration, et pourra bien entendu être amélioré.
il ne faut pas aussi oublier d’activer le mod rewrite d’Apache2 et faire passer toutes les urls reçues dans l’index.
-
RewriteEngine On
-
RewriteRule ^.*$ /var/www/index.php [NC,L]
prettyurls.conf
Le fichier prettyurls.conf est utilisé pour stocker nos urls, son format est assez simple
et pourra facilement être agrementé de nouvelles fonctionnalités.
- url : la pattern de l’url à chercher
- script : le nom du script ou controleur à charger
- type : le type de pattern (static|regex)
-
[*]
-
url = /;
-
script = Home;
-
type = static;
-
-
[category]
-
url = "/categories/.*-([0-9]+).html";
-
script = Category;
-
type = regex;
-
-
[404]
-
url = "/.*";
-
script = NotFound;
-
type = regex;
Le moteur du routeur d’url
Dans un premier temps on enregistre dans la variable $request
l’url issue de la requête HTTP sans ses paramètres.
Ensuite on charge notre fichier de configuration prettyurls.conf via la fonction,
parse_ini_file (), les configurations sont retournées sous la forme d’un tableau associatif.
-
$request = preg_replace (‘/^(.*)\?.*/’, ‘$1′, $_SERVER[‘REQUEST_URI’]);
-
/** examples */
-
$request = ‘/categories/eh-coco-1.html’;
-
$request = ‘/’;
-
$request = ‘/categories/eh-coco-1.html’;
-
$request = ‘/notfound/123456′;
-
-
/** load prettyurls */
-
$pretty_urls = parse_ini_file (‘prettyurl.conf’, true);
Le tableau est parcouru via une boucle foreach,
à chaque itération on vérifie le type d’url recherché, en fonction de celui-ci on teste la validité du pattern associé.
-
$is_ok = false;
-
$matched = array ();
-
-
foreach ($pretty_urls as $bit)
-
{
-
switch (@$bit[‘type’])
-
{
-
case ‘regex’:
-
preg_match (‘@’.$bit[‘url’].‘@’, $request, $matched);
-
if (!empty ($matched))
-
$is_ok = true;
-
break;
-
-
case ’static’:
-
if (strcasecmp ($request, $bit[‘url’]) === 0)
-
$is_ok = true;
-
break;
-
}
-
-
/** url has been matched */
-
if ($is_ok)
-
{
-
$controller = $bit[’script’];
-
break;
-
}
-
}
-
-
//FrontController::load ($controller, $matched);