Routes

Le principe de la réécriture d'adresse est de réorienter toutes les requêtes vers la page d'index et d'appeler le bon fichier en fonction de l'URL réellement écrite.

Ce principe correspond à un routage. Une route est un binôme qui fait correspondre une clé (l'URI) à une valeur (le chemin du fichier à ouvrir).

Pour ce qui est de la réécriture, nous l'avons vue dans la partie précédente à l'aide du fichier .htaccess.

1
RewriteEngine On
2
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

Dans la suite nous présentons comment appeler le bon fichier.

Définition$_SERVER['REQUEST_URI']

Cette variable correspond à l'URI qui a été fourni pour accéder à cette page.

C'est à dire avant la réécriture.

1
/afficher_un_livre

Définition$_SERVER['PHP_SELF']

Cette variable correspond au nom du fichier du script en cours d'exécution, par rapport à la racine web.

C'est à dire après la réécriture.

1
/index.php

MéthodeActiver la réécriture d'URL

Exemple d'URI

1
/dossier1/dossier2/afficher_un livre   // REQUEST_URI
2
/dossier1/dossier2/index.php           // PHP_SELF

On récupère le dossier source où se trouve la page d'index

1
dirname($_SERVER['PHP_SELF'])

Ce qui donne :

1
/dossier1/dossier2

On supprime le dossier source de l'URI

1
str_replace(dirname($_SERVER['PHP_SELF']), '', $_SERVER['REQUEST_URI'])

Ce qui donne :

1
/afficher_un_livre

MéthodeRoutage

Pour choisir le bon fichier, il suffit de créer tous les cas possibles (toutes les routes) dans un tableau associatif.

1
/*** Récupération de la clé de la route ***/
2
$origine = str_replace(dirname($_SERVER['PHP_SELF']), '', $_SERVER['REQUEST_URI']);
3
4
/*** ROUTES ***/
5
$routes = array(
6
    "/afficher_un_livre" => "livre/index",
7
    "/ajouter_un_livre" => "livre/ajouter",
8
    "/afficher_une_image" => "image/index",
9
    "/supprimer_une_image" => "image/supprimer"
10
);
11
12
/*** Création de l'url de destination ***/
13
$destination = (array_key_exists($origine, $routes) ? $routes[$origine] : "livre/index") . '.php';
14
15
/*** Appel du bon fichier ***/
16
require $destination;