Paprastas maršrutizavimas PHP variklyje

Ankstesnėje pamokoje mūsų svetainėje buvo tik viena URL grupa. Žinoma, paprastai svetainėje būna kelių tipų adresai.

Kiekvieną adresų grupę apdoros savo reguliari išraiška, kuri vadinama maršrutais. Atitinkamai maršrutų atitikimo ir jų apdorojimo kodo suderinimo procesas vadinamas maršrutizavimu.

Tarkime, pavyzdžiui, kad turime dviejų tipų adresus. Kiekvienai grupei parašykime savo maršrutą:

index.php<?php
  if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
    // vienas puslapis pagal slug
  }
  
  if (preg_match('#^/page/all$#', $url, $params)) {
    // visų puslapių sąrašas
  }
?>

Patogumui kiekvieno maršruto apdorojimo kodą išskirkime į atskirą failą:

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

Prijungiami failai savo rezultatu turi grąžinti masyvą su puslapio pavadinimu ir turiniu.

Parašykime pirmojo failo kodą, kuris atvaizduoja vieną puslapį pagal jo 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;
?>

O dabar parašykime antrojo failo kodą, kuris atvaizduoja visų puslapių nuorodų sąrašą:

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

Įvykdžius vieną iš sąlygų kintamajame $page visada bus masyvas iš vienos struktūros. Naudokime šį masyvą, kad pastatytume pavadinimą ir turinį į svetainės šabloną:

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

Sujunkime viską kartu ir gausime tokį kodą:

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

Tarkime, kad turite svetainę su vartotojais. Sukurkite pushlapį vieno vartotojo rodymui, pushlapį visų vartotojų išvedimui ir pushlapį su forma naujo vartotojo pridėjimui.