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:
| id | slug | name |
|---|---|---|
| 1 | first-category | name1 |
| 2 | second-category | name2 |
Và bảng với các trang:
| 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
$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:
<?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:
<?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;
?>
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.