Meerdere parameters in route van de engine in PHP
Stel dat we nu categorieën op onze website hebben en pagina's die tot deze categorieën behoren. Laten we een tabel met categorieën maken:
| id | slug | name |
|---|---|---|
| 1 | first-category | name1 |
| 2 | second-category | name2 |
En een tabel met pagina's:
| 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 |
Op onze website staan we toe dat slugs
van pagina's uit verschillende categorieën overeenkomen. Dit
betekent dat we in de URL eerst de
slug van de categorie moeten specificeren, en dan de slug van de pagina volgens
dit schema: /page/:category/:page,
waar de dubbele punten de plaatsen aangeven waar
de veranderende parameters zullen staan.
Laten we routes voor onze website schrijven:
<?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';
}
?>
In de handler van de eerste route zullen we de gevraagde pagina tonen:
<?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;
?>
In de handler van de tweede route zullen we de lijst met pagina's uit de opgegeven categorie tonen:
<?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' => 'lijst van alle pagina\'s in categorie ' . $catSlug,
'content' => $content
];
return $page;
?>
Stel dat je een website hebt met steden en landen.
Laat op adres / de lijst
van alle landen zien, op adres /:country
de lijst met steden van het in de parameter opgegeven
land, en op adres /:country/:city
de beschrijving van de opgegeven stad.