Proste routowanie w silniku w PHP
W poprzedniej lekcji na naszej stronie była tylko jedna grupa adresów URL. Oczywiście, zazwyczaj na stronie jest kilka typów adresów.
Każda grupa adresów będzie obsługiwana swoim własnym wyrażeniem regularnym, które nazywane są routami. Odpowiednio proces dopasowywania routów i kodu do ich obsługi nazywa się routowaniem.
Załóżmy, na przykład, że mamy dwa typy adresów. Dla każdej grupy napiszmy swój rout:
<?php
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
// jedna strona po slugu
}
if (preg_match('#^/page/all$#', $url, $params)) {
// lista wszystkich stron
}
?>
Dla wygody wynieśmy kod obsługi każdego routu do oddzielnego pliku:
<?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';
}
?>
Podłączane pliki swoim wynikiem powinny zwracać tablicę z tytułem i treścią strony.
Napiszmy kod pierwszego pliku, wyświetlającego jedną stronę po jej slugu:
<?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;
?>
A teraz napiszmy kod drugiego pliku, wyświetlającego listę linków do wszystkich stron:
<?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;
?>
Po wykonaniu jednego z warunków w zmiennej
$page zawsze będzie tablica o jednej
strukturze. Użyjmy tej tablicy, aby
podstawić tytuł i treść do szablonu strony:
<?php
$layout = file_get_contents('layout.php');
$layout = str_replace('{{ title }}', $page['title'], $layout);
$layout = str_replace('{{ content }}', $page['content'], $layout);
echo $layout;
?>
Złóżmy wszystko razem i otrzymamy następujący kod:
<?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;
?>
Załóżmy, że masz stronę z użytkownikami. Zrób stronę do wyświetlenia jednego użytkownika, stronę do wyświetlenia wszystkich użytkowników i stronę z formularzem do dodawania nowego użytkownika.