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 :

index.php<?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é :

index.php<?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 :

view/page/show.php<?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 :

view/page/all.php<?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 :

index.php<?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 :

index.php<?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;
?>
Задание 1

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.