Lihtne marsruutimine PHP mootoris

Eelmises õppetükis oli meil saidil ainult üks URL-ide rühm. Loomulikult on tavalisel saidil mitu tüüpi aadresse.

Iga aadressirühm töödeldakse oma regulaaravaldisega, mida nimetatakse marsruutideks. Vastavalt protsessi marsruutide sobitamist ja nende töötlemiseks mõeldud koodi nimetatakse marsruutimiseks.

Oletame, et meil on näiteks kaks tüüpi aadresse. Kirjutame iga rühma jaoks oma marsruudi:

index.php<?php
  if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
    // üks leht slangi järgi
  }
  
  if (preg_match('#^/page/all$#', $url, $params)) {
    // kõikide lehtede nimekiri
  }
?>

Mugavuse huvides viime iga marsruudi töötlemise koodi eraldi faili:

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

Kaasatavad failid peaksid oma tulemusena tagastama massiivi lehe pealkirja ja sisuga.

Kirjutame esimese faili koodi, mis väljastab ühe lehe selle slangi järgi:

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

Ja nüüd kirjutame teise faili koodi, mis väljastab linkide nimekirja kõikidele lehtedele:

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' => 'kõik lehed',
    'content' => $content
  ];
  
  return $page;
?>

Pärast ühe tingimuse täitmist on muutujas $page alati massiiv ühest struktuurist. Kasutame seda massiivi, et asendada pealkiri ja sisu saidi mallis:

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

Kogume kõik kokku ja saame järgmise koodi:

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

Oletame, et teil on kasutajatega sait. Tehke leht ühe kasutaja kuvamiseks, leht kõikide kasutajate väljastamiseks ja leht vormiga uue kasutaja lisamiseks.