Mehrere Parameter in Routen der Engine in PHP

Nehmen wir an, dass unsere Website nun Kategorien und Seiten hat, die diesen Kategorien zugeordnet sind. Lassen Sie uns eine Tabelle mit Kategorien erstellen:

categories
id slug name
1 first-category name1
2 second-category name2

Und eine Tabelle mit Seiten:

pages
id slug title content category_id
1 my-first-page title1 <div> content1 </div> 1
2 my-second-page title2 <div> content2 </div> 1
3 my-third-page title3 <div> content3 </div> 2

Auf unserer Website erlauben wir, dass die Slugs von Seiten aus verschiedenen Kategorien übereinstimmen können. Das bedeutet, dass wir in der URL zuerst den Slug der Kategorie und dann den Slug der Seite angeben müssen, und zwar nach diesem Schema: /page/:category/:page, wobei die Doppelpunkte die Stellen kennzeichnen, an denen sich die veränderlichen Parameter befinden.

Lassen Sie uns die Routen für unsere Website schreiben:

php<?php
  $route = '^/page/(?<catSlug>[a-z0-9_-]+)/(?<pageSlug>[a-z0-9_-]+)
;
  if (preg_match("#$route#", $url, $params)) {
    $page = include 'view/page/show.php';
  }
  
  $route = '^/page/(?<catSlug>[a-z0-9_-]+)
;
  if (preg_match("#$route#", $url, $params)) {
    $page = include 'view/page/category.php';
  }
  
  $route = '^/
;
  if (preg_match("#$route#", $url, $params)) {
    $page = include 'view/page/all.php';
  }
?>

Im Handler der ersten Route zeigen wir die angeforderte Seite an:

view/page/show.php<?php
  $catSlug = $params['catSlug'];
  $pageSlug = $params['pageSlug'];
  
  $query = "SELECT pages.title, pages.content 
    FROM pages
  LEFT JOIN
    category ON category.id=pages.category_id
  WHERE
    pages.slug='$pageSlug' AND category.slug='$catSlug'";
  
  $res = mysqli_query($link, $query) or die(mysqli_error($link));
  $page = mysqli_fetch_assoc($res);
  
  return $page;
?>

Im Handler der zweiten Route zeigen wir die Liste der Seiten aus der angegebenen Kategorie an:

view/page/category.php<?php
  $catSlug = $params['catSlug'];
  
  $query = "SELECT pages.slug, pages.title FROM pages
  LEFT JOIN
    category ON category.id=pages.category_id
  WHERE
    category.slug='$catSlug'";
  
  $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/' . $catSlug . '/'  . $page['slug'] . '">' . $page['title'] . '</a>
      </div>
    ';
  }
  
  $page = [
    'title' => 'Liste aller Seiten der Kategorie ' . $catSlug,
    'content' => $content
  ];
  
  return $page;
?>
Задание 1

Nehmen wir an, Sie haben eine Website mit Städten und Ländern. Unter der Adresse / soll eine Liste aller Länder ausgegeben werden, unter der Adresse /:country die Liste der Städte des im Parameter angegebenen Landes und unter der Adresse /:country/:city die Beschreibung der angegebenen Stadt.