Simpel routing i en PHP-motor
I den forrige lektion var der kun en gruppe af URLs på vores hjemmeside. Selvfølgelig er der normalt flere typer adresser på en hjemmeside.
Hver gruppe af adresser vil blive behandlet af deres eget regulære udtryk, som kaldes ruter. Følgelig kaldes processen med at matche ruter og kode til deres behandling for routing.
Lad os for eksempel sige, at vi har to typer adresser. Lad os skrive vores egen rute for hver gruppe:
<?php
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
// en side via slug
}
if (preg_match('#^/page/all$#', $url, $params)) {
// liste over alle sider
}
?>
For nemheds skyld lægger vi koden til hver rutes behandling i 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 inkluderede filer skal returnere et array med sidens titel og indhold som deres resultat.
Lad os skrive koden til den første fil, som viser en enkelt side via dens 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;
?>
Og lad os nu skrive koden til den anden fil, som viser en liste over links til alle sider:
<?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' => 'alle sider',
'content' => $content
];
return $page;
?>
Efter udførelsen af en af betingelserne vil der i variablen
$page altid være et array med én
struktur. Lad os bruge dette array til at
indsætte titel og indhold i websitets skabelon:
<?php
$layout = file_get_contents('layout.php');
$layout = str_replace('{{ title }}', $page['title'], $layout);
$layout = str_replace('{{ content }}', $page['content'], $layout);
echo $layout;
?>
Lad os samle alt og få følgende kode:
<?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;
?>
Antag at du har et websted med brugere. Lav en side til at vise en enkelt bruger, en side til at vise alle brugere og en side med en formular til at tilføje en ny bruger.