Định tuyến đơn giản trong engine bằng PHP
Trong bài học trước trên trang web của chúng ta chỉ có một nhóm URL. Tất nhiên, thông thường một trang web có nhiều loại địa chỉ khác nhau.
Mỗi nhóm địa chỉ sẽ được xử lý bởi một biểu thức chính quy riêng, được gọi là route. Tương ứng, quá trình ánh xạ các route và mã để xử lý chúng được gọi là routing.
Giả sử, ví dụ, chúng ta có hai loại địa chỉ. Hãy viết một route riêng cho mỗi nhóm:
<?php
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
// một trang theo slug
}
if (preg_match('#^/page/all$#', $url, $params)) {
// danh sách tất cả các trang
}
?>
Để thuận tiện, hãy tách mã xử lý mỗi route ra một tệp riêng biệt:
<?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';
}
?>
Các tệp được include phải trả về kết quả là một mảng chứa title và content của trang.
Hãy viết mã cho tệp đầu tiên, hiển thị một trang theo slug của nó:
<?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;
?>
Và bây giờ hãy viết mã cho tệp thứ hai, hiển thị danh sách liên kết đến tất cả các trang:
<?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' => 'all pages',
'content' => $content
];
return $page;
?>
Sau khi thực hiện một trong các điều kiện, trong biến
$page sẽ luôn có một mảng với cùng một
cấu trúc. Hãy sử dụng mảng này để
chèn title và content vào template của trang web:
<?php
$layout = file_get_contents('layout.php');
$layout = str_replace('{{ title }}', $page['title'], $layout);
$layout = str_replace('{{ content }}', $page['content'], $layout);
echo $layout;
?>
Tổng hợp tất cả lại, chúng ta có mã sau:
<?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;
?>
Giả sử bạn có một trang web với người dùng. Hãy tạo một trang để hiển thị một người dùng, một trang để hiển thị tất cả người dùng và một trang với biểu mẫu để thêm người dùng mới.