Routage simple dans un moteur en PHP
Dans la leçon précédente sur notre site, il n'y avait qu'un seul groupe d'URL. Bien sûr, généralement sur un site, il existe plusieurs types d'adresses.
Chaque groupe d'adresses sera traité par sa propre expression régulière, qui sont appelées routes. En conséquence, le processus de mise en correspondance des routes et du code pour les traiter est appelé routage.
Supposons, par exemple, que nous ayons deux types d'adresses. Écrivons une route pour chaque groupe :
<?php
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
// une page par son slug
}
if (preg_match('#^/page/all$#', $url, $params)) {
// liste de toutes les pages
}
?>
Pour plus de commodité, mettons le code de traitement de chaque route dans un fichier séparé :
<?php
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
$page = include 'view/page/show.php';
}
if (preg_match('#^/page/all$#', $url, $params)) {
$page = include 'view/page/all.php';
}
?>
Les fichiers inclus doivent retourner comme résultat un tableau avec le titre et le contenu de la page.
Écrivons le code du premier fichier, affichant une page par son slug :
<?php
$slug = $params[1];
$query = "SELECT * FROM pages WHERE slug='$slug'";
$res = mysqli_query($link, $query) or die(mysqli_error($link));
$page = mysqli_fetch_assoc($res);
return $page;
?>
Et maintenant, écrivons le code du deuxième fichier, affichant une liste de liens vers toutes les pages :
<?php
$query = "SELECT slug, title FROM pages";
$res = mysqli_query($link, $query) or die(mysqli_error($link));
for ($data = []; $row = mysqli_fetch_assoc($res); $data[] = $row);
$content = '';
foreach ($data as $page) {
$content .= '
<div>
<a href="/page/' . $page['slug'] . '">' . $page['title'] . '</a>
</div>
';
}
$page = [
'title' => 'all pages',
'content' => $content
];
return $page;
?>
Après l'exécution d'une des conditions, la variable
$page contiendra toujours un tableau de la même
structure. Utilisons ce tableau pour
insérer le titre et le contenu dans le template du site :
<?php
$layout = file_get_contents('layout.php');
$layout = str_replace('{{ title }}', $page['title'], $layout);
$layout = str_replace('{{ content }}', $page['content'], $layout);
echo $layout;
?>
Rassemblons tout et obtenons le code suivant :
<?php
$url = $_SERVER['REQUEST_URI'];
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
$page = include 'view/page/show.php';
}
if (preg_match('#^/page/all$#', $url, $params)) {
$page = include 'view/page/all.php';
}
$layout = file_get_contents('layout.php');
$layout = str_replace('{{ title }}', $page['title'], $layout);
$layout = str_replace('{{ content }}', $page['content'], $layout);
echo $layout;
?>
Supposons que vous ayez un site avec des utilisateurs. Créez une page pour afficher un utilisateur, une page pour afficher tous les utilisateurs et une page avec un formulaire pour ajouter un nouvel utilisateur.