Enkel routing i en PHP-motor
I forrige leksjon var det bare én gruppe med URL-er på nettstedet vårt. Selvfølgelig er det vanligvis flere typer adresser på et nettsted.
Hver gruppe med adresser vil bli behandlet med sitt eget regulære uttrykk, som kalles ruter. Følgelig kalles prosessen med å matche ruter og kode for deres behandling ruting.
La oss for eksempel si at vi har to typer adresser. La oss skrive vår egen rute for hver gruppe:
<?php
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
// én side basert på slug
}
if (preg_match('#^/page/all$#', $url, $params)) {
// liste over alle sider
}
?>
For enkelhets skyld, la oss flytte koden som håndterer hver rute til en egen 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 inkluderte filene skal returnere en matrise med sidens tittel og innhold som sitt resultat.
La oss skrive koden til den første filen, som viser én side basert på 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 la oss nå skrive koden til den andre filen, som viser en liste med lenker til alle sidene:
<?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;
?>
Etter utførelse av en av betingelsene vil variabelen
$page alltid være en matrise med én
struktur. La oss bruke denne matrisen til å
sette inn tittel og innhold i nettstedets mal:
<?php
$layout = file_get_contents('layout.php');
$layout = str_replace('{{ title }}', $page['title'], $layout);
$layout = str_replace('{{ content }}', $page['content'], $layout);
echo $layout;
?>
La oss sette alt sammen 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;
?>
Anta at du har et nettsted med brukere. Lag en side for å vise én bruker, en side for å vise alle brukere og en side med et skjema for å legge til en ny bruker.