Как улучшить этот статический роутер? Первоначально была задумка сделать роутер, но как-то так незаметно получилось что в Foo у меня оказалось почти всё приложение ))
Задумка была такая:
сайт.ру/news/ - страница со списком новостей
сайт.ру/news/page/2 - пагинатор, вторая страница со списком новостей
сайт.ру/news/14/duma-prynyala-zakon - отдельная страница новости где 14 это её id а последний сегмент чисто для поисковиков// Запрошенный URL
$part = explode('/', $_SERVER['REQUEST_URI']);
// Запускаем обработчик
$foo = new Foo();
if(!isset($part[2])){ $part[2] = '';}
if(!isset($part[3])){ $part[3] = '';}
$foo->check($part[1],$part[2],$part[3]);
// Обработчик Foo находится в другом файле class.Foo.php
class Foo
{
function check($catalog, $part, $three)
{
// Назначим разделам сайта имена методов-обработчиков
switch ($catalog) {
case 'news': $name = 'news'; break;
case 'art': $name = 'art'; break;
}

// Если URI содержит только каталог, то это страница со списком материалов
if(!isset($part) || empty($part)){
$name = $name.'_main';
}

// Вызываем метод обработчик этого раздела сайта
$this->$name($part, $three);
}

function news($part, $three){
echo "Это страница новости с id=$three";
}
function art($part, $three){
echo "Это страница статьи с id=$three";
}
function news_main($part, $three){
echo "Это страница со списком новостей";
}
function art_main($part, $three){
echo "Это страница со списком статей";
}
}
Вопросы:
1. Допустим explode разбивку URI можно вынести в конфиг. Куда правильно вынести проверку существования всех частей адреса (т.е. $part[2] и $part[3]) в index.php ей явно не дело болтаться.
2. Правильно ли я понял что метод check сейчас выполняет функцию роутера? И что бы он стал нормальным роутером его надо вынести в другой класс, что бы он не был связан с классом Foo?
Любые комментарии приветствуются...

21 Авг 2019 в 07:04
208 +1
0
Ответы
1

Да, вы правильно поняли, что метод check сейчас выполняет функцию роутера. Для улучшения статического роутера можно вынести проверку существования всех частей адреса в отдельный класс, который будет отвечать исключительно за обработку и проверку URI. Это поможет разделить ответственности и сделать код более чистым и модульным.

Примерно так можно изменить код:

В файле index.php:

// Запрошенный URL
$part = explode('/', $_SERVER['REQUEST_URI']);
// Запускаем обработчик
$router = new Router();
$router->route($part);

В файле Router.php:

class Router
{
public function route($part)
{
$controller = new Foo();
$catalog = isset($part[1]) ? $part[1] : '';
$subPage = isset($part[2]) ? $part[2] : '';
$id = isset($part[3]) ? $part[3] : '';
switch ($catalog) {
case 'news':
$controller->news($subPage, $id);
break;
case 'art':
$controller->art($subPage, $id);
break;
default:
echo "404 Not Found";
break;
}
}
}

Таким образом, вы разделяете логику роутинга (в классе Router) от логики обработки запросов (в классе Foo). Это делает код более структурированным и удобным для поддержки и дальнейшего расширения.

20 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир