Rutare simplă în motorul în PHP

În lecția precedentă pe site-ul nostru era doar un singur grup de URL-uri. Desigur, de obicei pe site există mai multe tipuri de adrese.

Fiecare grup de adrese va fi procesat cu propria expresie regulată, care se numesc rute. În consecință procesul de potrivire a rutelor și a codului pentru procesarea lor se numește rutare.

Să presupunem, de exemplu, că avem două tipuri de adrese. Să scriem o rută pentru fiecare grup:

index.php<?php
  if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
    // o pagină după slug
  }
  
  if (preg_match('#^/page/all$#', $url, $params)) {
    // lista tuturor paginilor
  }
?>

Pentru comoditate, vom muta codul de procesare al fiecărei rute într-un fișier separat:

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

Fișierele incluse trebuie să returneze un array cu titlul și conținutul paginii.

Să scriem codul primului fișier, care afișează o pagină după slug-ul ei:

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

Și acum să scriem codul celui de-al doilea fișier, care afișează lista de link-uri către toate paginile:

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' => 'toate paginile',
    'content' => $content
  ];
  
  return $page;
?>

După executarea uneia dintre condiții în variabila $page va fi întotdeauna un array cu aceeași structură. Vom folosi acest array pentru a înlocui titlul și conținutul în șablonul site-ului:

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

Să adunăm totul împreună și să obținem următorul cod:

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

Să presupunem că aveți un site cu utilizatori. Realizați o pagină pentru afișarea unui singur utilizator, o pagină pentru afișarea tuturor utilizatorilor și o pagină cu un formular pentru adăugarea unui nou utilizator.