Как улучшить этот статический роутер? Первоначально была задумка сделать роутер, но как-то так незаметно получилось что в 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? Любые комментарии приветствуются...
Да, вы правильно поняли, что метод check сейчас выполняет функцию роутера. Для улучшения статического роутера можно вынести проверку существования всех частей адреса в отдельный класс, который будет отвечать исключительно за обработку и проверку URI. Это поможет разделить ответственности и сделать код более чистым и модульным.
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). Это делает код более структурированным и удобным для поддержки и дальнейшего расширения.
Да, вы правильно поняли, что метод 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). Это делает код более структурированным и удобным для поддержки и дальнейшего расширения.