Mehrere Parameter in Routen der Engine in PHP
Nehmen wir an, dass unsere Website nun Kategorien und Seiten hat, die diesen Kategorien zugeordnet sind. Lassen Sie uns eine Tabelle mit Kategorien erstellen:
| id | slug | name |
|---|---|---|
| 1 | first-category | name1 |
| 2 | second-category | name2 |
Und eine Tabelle mit Seiten:
| id | slug | title | content | category_id |
|---|---|---|---|---|
| 1 | my-first-page | title1 | <div> content1 </div> | 1 |
| 2 | my-second-page | title2 | <div> content2 </div> | 1 |
| 3 | my-third-page | title3 | <div> content3 </div> | 2 |
Auf unserer Website erlauben wir, dass die Slugs
von Seiten aus verschiedenen Kategorien übereinstimmen können. Das
bedeutet, dass wir in der URL zuerst den
Slug der Kategorie und dann den Slug der Seite angeben müssen,
und zwar nach diesem Schema: /page/:category/:page,
wobei die Doppelpunkte die Stellen kennzeichnen, an denen
sich die veränderlichen Parameter befinden.
Lassen Sie uns die Routen für unsere Website schreiben:
<?php
$route = '^/page/(?<catSlug>[a-z0-9_-]+)/(?<pageSlug>[a-z0-9_-]+)
;
if (preg_match("#$route#", $url, $params)) {
$page = include 'view/page/show.php';
}
$route = '^/page/(?<catSlug>[a-z0-9_-]+)
;
if (preg_match("#$route#", $url, $params)) {
$page = include 'view/page/category.php';
}
$route = '^/
;
if (preg_match("#$route#", $url, $params)) {
$page = include 'view/page/all.php';
}
?>
Im Handler der ersten Route zeigen wir die angeforderte Seite an:
<?php
$catSlug = $params['catSlug'];
$pageSlug = $params['pageSlug'];
$query = "SELECT pages.title, pages.content
FROM pages
LEFT JOIN
category ON category.id=pages.category_id
WHERE
pages.slug='$pageSlug' AND category.slug='$catSlug'";
$res = mysqli_query($link, $query) or die(mysqli_error($link));
$page = mysqli_fetch_assoc($res);
return $page;
?>
Im Handler der zweiten Route zeigen wir die Liste der Seiten aus der angegebenen Kategorie an:
<?php
$catSlug = $params['catSlug'];
$query = "SELECT pages.slug, pages.title FROM pages
LEFT JOIN
category ON category.id=pages.category_id
WHERE
category.slug='$catSlug'";
$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/' . $catSlug . '/' . $page['slug'] . '">' . $page['title'] . '</a>
</div>
';
}
$page = [
'title' => 'Liste aller Seiten der Kategorie ' . $catSlug,
'content' => $content
];
return $page;
?>
Nehmen wir an, Sie haben eine Website mit Städten und Ländern.
Unter der Adresse / soll eine Liste
aller Länder ausgegeben werden, unter der Adresse /:country
die Liste der Städte des im Parameter angegebenen
Landes und unter der Adresse /:country/:city
die Beschreibung der angegebenen Stadt.