Enkel routing i en motor i PHP
I föregående lektion fanns det bara en grupp av webbadresser på vår webbplats. Normalt finns det naturligtvis flera typer av adresser på en webbplats.
Varje grupp av adresser kommer att hanteras av sitt eget reguljära uttryck, som kallas routes. Följaktligen kallas processen att matcha routes och kod för deras hantering för routing.
Låt oss säga att vi till exempel har två typer av adresser. Låt oss skriva en egen route för varje grupp:
<?php
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
// en sida via dess slug
}
if (preg_match('#^/page/all$#', $url, $params)) {
// lista över alla sidor
}
?>
För enkelhets skull låt oss flytta koden som hanterar varje route till en separat fil:
<?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';
}
?>
De inkluderade filerna ska returnera en array med sidans titel och innehåll som sitt resultat.
Låt oss skriva koden för den första filen, som visar en sida via dess slug:
<?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;
?>
Och nu skriver vi koden för den andra filen, som visar en lista med länkar till alla sidor:
<?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' => 'alla sidor',
'content' => $content
];
return $page;
?>
Efter att ett av villkoren har uppfyllts kommer variabeln
$page alltid att innehålla en array med en
struktur. Låt oss använda denna array för att
sätta in titeln och innehållet i webbplatsens mall:
<?php
$layout = file_get_contents('layout.php');
$layout = str_replace('{{ title }}', $page['title'], $layout);
$layout = str_replace('{{ content }}', $page['content'], $layout);
echo $layout;
?>
Låt oss sätta ihop allt och få följande 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;
?>
Anta att du har en webbplats med användare. Skapa en sida för att visa en användare, en sida för att visa alla användare och en sida med ett formulär för att lägga till en ny användare.