В предыдущем уроке на нашем сайте была только одна группа урлов. Конечно же, обычно на сайте бывает несколько типов адресов.
Каждая группа адресов будет обрабатываться своим регулярным выражением, которые называются маршрутами или роутами. Соответственно процесс сопоставления маршрутов и кода для их обработки называется маршрутизацией или роутингом
Пусть, к примеру, у нас есть два типа адресов. Давайте для каждой группы напишем свой роут:
<?php
if (preg_match('#/page/([a-z0-9_-]+)#', $url, $params)) {
// одна страница по слагу
}
if (preg_match('#/page/all#', $url, $params)) {
// список всех страниц
}
?>
Для удобства вынесем код обработки каждого роута в отдельный файл:
<?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';
}
?>
Своим результатом подключаемые файлы должны возвращать массив с тайтлом и контентом страницы.
Давайте напишем код первого файла, выводящего одну страницу по ее слагу:
<?php
$slug = $params[1];
$query = "SELECT * FROM pages WHERE slug='$slug'";
$result = mysqli_query($link, $query) or die(mysqli_error($link));
$page = mysqli_fetch_assoc($result);
return $page;
?>
А теперь напишем код второго файла, выводящего список ссылок на все страницы:
<?php
$query = "SELECT slug, title FROM pages";
$result = mysqli_query($link, $query) or die(mysqli_error($link));
for ($data = []; $row = mysqli_fetch_assoc($result); $data[] = $row);
$content = '';
foreach ($data as $page) {
$content .= '
<div>
<a href="/page/' . $page['slug'] . '">' . $page['title'] . '</a>
</div>
';
}
$page = [
'title' => 'список всех страниц',
'content' => $content
];
return $page;
?>
После выполнения одного из условий в переменной
$page
всегда будет массив из одной
структуры. Используем этот массив, чтобы
подставить тайтл и контент в шаблон сайта:
<?php
$layout = file_get_contents('layout.php');
$layout = str_replace('{{ title }}', $page['title'], $layout);
$layout = str_replace('{{ content }}', $page['content'], $layout);
echo $layout;
?>
Соберем все вместе и получим следующий код:
<?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;
?>
Пусть у вас есть сайт с юзерами. Сделайте страницу для показа одного юзера, страницу для вывода всех юзеров и страницу с формой для добавления нового юзера.