Простой роутинг в движке в PHP

В предыдущем уроке на нашем сайте была только одна группа урлов. Конечно же, обычно на сайте бывает несколько типов адресов.

Каждая группа адресов будет обрабатываться своим регулярным выражением, которые называются маршрутами или роутами. Соответственно процесс сопоставления маршрутов и кода для их обработки называется маршрутизацией или роутингом

Пусть, к примеру, у нас есть два типа адресов. Давайте для каждой группы напишем свой роут:

<?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'"; $res = mysqli_query($link, $query) or die(mysqli_error($link)); $page = mysqli_fetch_assoc($res); return $page; ?>

А теперь напишем код второго файла, выводящего список ссылок на все страницы:

<?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' => 'список всех страниц', '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; ?>

Пусть у вас есть сайт с юзерами. Сделайте страницу для показа одного юзера, страницу для вывода всех юзеров и страницу с формой для добавления нового юзера.