Простой роутинг в движке в PHP

В предыдущем уроке на нашем сайте была только одна группа урлов. Конечно же, обычно на сайте бывает несколько типов адресов.

Каждая группа адресов будет обрабатываться своим регулярным выражением, которые называются роутами. Соответственно процесс сопоставления роутов и кода для их обработки называется роутингом.

Пусть, к примеру, у нас есть два типа адресов. Давайте для каждой группы напишем свой роут:

index.php<?php
  if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
    // одна страница по слагу
  }
  
  if (preg_match('#^/page/all$#', $url, $params)) {
    // список всех страниц
  }
?>

Для удобства вынесем код обработки каждого роута в отдельный файл:

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';
  }
?>

Своим результатом подключаемые файлы должны возвращать массив с тайтлом и контентом страницы.

Давайте напишем код первого файла, выводящего одну страницу по ее слагу:

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;
?>

А теперь напишем код второго файла, выводящего список ссылок на все страницы:

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;
?>

После выполнения одного из условий в переменной $page всегда будет массив из одной структуры. Используем этот массив, чтобы подставить тайтл и контент в шаблон сайта:

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;
?>

Соберем все вместе и получим следующий код:

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

Пусть у вас есть сайт с юзерами. Сделайте страницу для показа одного юзера, страницу для вывода всех юзеров и страницу с формой для добавления нового юзера.