Nhiều tham số trong route của engine PHP

Bây giờ giả sử trang web của chúng ta có các danh mục và các trang thuộc về những danh mục này. Hãy tạo bảng với các danh mục:

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

Và bảng với các trang:

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

Trên trang web của chúng ta, chúng ta cho phép các slug của trang từ các danh mục khác nhau trùng nhau. Điều này có nghĩa là trong URL chúng ta phải chỉ định trước slug của danh mục, sau đó đến slug của trang theo sơ đồ như sau: /page/:category/:page, trong đó dấu hai chấm chỉ ra các vị trí mà các tham số thay đổi sẽ nằm ở đó.

Hãy viết các route cho trang web của chúng ta:

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

Trong trình xử lý của route đầu tiên, chúng ta sẽ hiển thị trang được yêu cầu:

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

Trong trình xử lý của route thứ hai, chúng ta sẽ hiển thị danh sách các trang từ danh mục được chỉ định:

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' => 'danh sách tất cả các trang của danh mục ' . $catSlug,
    'content' => $content
  ];
  
  return $page;
?>
Задание 1

Giả sử bạn có một trang web với các thành phố và quốc gia. Giả sử tại địa chỉ / hiển thị danh sách tất cả các quốc gia, tại địa chỉ /:country hiển thị danh sách các thành phố của quốc gia được chỉ định trong tham số, và tại địa chỉ /:country/:city là mô tả của thành phố được chỉ định.