Eenvoudige routing in een engine in PHP
In de vorige les was er op onze website alleen één groep URL's. Natuurlijk zijn er meestal meerdere soorten adressen op een website.
Elke groep adressen wordt verwerkt door zijn eigen reguliere expressie, die routes worden genoemd. Dienovereenkomstig heet het proces van het matchen van routes en code voor hun verwerking routing.
Stel dat we bijvoorbeeld twee soorten adressen hebben. Laten we voor elke groep onze eigen route schrijven:
<?php
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
// één pagina via slug
}
if (preg_match('#^/page/all$#', $url, $params)) {
// lijst van alle pagina's
}
?>
Voor het gemak halen we de verwerkingscode van elke route in een apart bestand:
<?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 geïncludeerde bestanden moeten als resultaat een array teruggeven met de titel en inhoud van de pagina.
Laten we de code schrijven van het eerste bestand, dat één pagina toont via zijn 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;
?>
En laten we nu de code schrijven van het tweede bestand, dat een lijst met links naar alle pagina's toont:
<?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 pagina\'s',
'content' => $content
];
return $page;
?>
Na het uitvoeren van een van de voorwaarden zal er in de variabele
$page altijd een array met dezelfde
structuur zitten. We gebruiken deze array om
de titel en inhoud in de sitelayout te plaatsen:
<?php
$layout = file_get_contents('layout.php');
$layout = str_replace('{{ title }}', $page['title'], $layout);
$layout = str_replace('{{ content }}', $page['content'], $layout);
echo $layout;
?>
Laten we alles samenvoegen en we krijgen de volgende code:
<?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;
?>
Stel je hebt een site met gebruikers. Maak een pagina om één gebruiker te tonen, een pagina om alle gebruikers weer te geven en een pagina met een formulier om een nieuwe gebruiker toe te voegen.