Einfaches Routing in einer PHP-Engine
In der vorherigen Lektion gab es auf unserer Website nur eine Gruppe von URLs. Normalerweise gibt es auf einer Website natürlich mehrere Arten von Adressen.
Jede Gruppe von Adressen wird durch einen eigenen regulären Ausdruck verarbeitet, die Routes genannt werden. Dementsprechend wird der Prozess des Zuordnens von Routes und des Codes für deren Verarbeitung als Routing bezeichnet.
Nehmen wir an, wir haben beispielsweise zwei Arten von Adressen. Lassen Sie uns für jede Gruppe eine eigene Route schreiben:
<?php
if (preg_match('#^/page/([a-z0-9_-]+)$#', $url, $params)) {
// eine Seite anhand des Slugs
}
if (preg_match('#^/page/all$#', $url, $params)) {
// Liste aller Seiten
}
?>
Der Einfachheit halber lagern wir den Verarbeitungscode jeder Route in eine separate Datei aus:
<?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';
}
?>
Die eingebundenen Dateien sollten als Ergebnis ein Array mit dem Titel und dem Inhalt der Seite zurückgeben.
Lassen Sie uns den Code der ersten Datei schreiben, die eine Seite anhand ihres Slugs ausgibt:
<?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;
?>
Und nun schreiben wir den Code der zweiten Datei, die eine Liste mit Links zu allen Seiten ausgibt:
<?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;
?>
Nach der Ausführung einer der Bedingungen wird in der Variable
$page immer ein Array mit einer
Struktur vorhanden sein. Wir verwenden dieses Array, um
Titel und Inhalt in das Website-Template einzusetzen:
<?php
$layout = file_get_contents('layout.php');
$layout = str_replace('{{ title }}', $page['title'], $layout);
$layout = str_replace('{{ content }}', $page['content'], $layout);
echo $layout;
?>
Fassen wir alles zusammen und erhalten folgenden 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;
?>
Angenommen, Sie haben eine Website mit Benutzern. Erstellen Sie eine Seite zur Anzeige eines einzelnen Benutzers, eine Seite zur Auflistung aller Benutzer und eine Seite mit einem Formular zum Hinzufügen eines neuen Benutzers.