Прост маршрутизатор в двигател на PHP
В предишния урок на нашия сайт имаше само една група URL адреси. Разбира се, обикновено на сайта има няколко типа адреси.
Всяка група адреси ще бъде обработвана от собствено регулярно изражение, които се наричат маршрути. Съответно процесът на съпоставяне на маршрути и код за тяхната обработка се нарича маршрутизация.
Да предположим, че имаме два типа адреси. Нека за всяка група напишем собствен маршрут:
<?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;
?>
Да предположим, че имате сайт с потребители. Направете страница за показване на един потребител, страница за извеждане на всички потребители и страница с форма за добавяне на нов потребител.