Как улучшить этот статический роутер?

Первоначально была задумка сделать роутер, но как-то так незаметно получилось что в 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<br>";
    }

    function art($part, $three){
        echo "Это страница статьи с id=$three<br>";
    }

    function news_main($part, $three){
        echo "Это страница со списком новостей<br>";
    }

    function art_main($part, $three){
        echo "Это страница со списком статей<br>";
    }
}

Вопросы:
1. Допустим explode разбивку URI можно вынести в конфиг. Куда правильно вынести проверку существования всех частей адреса (т.е. $part[2] и $part[3]) в index.php ей явно не дело болтаться.
2. Правильно ли я понял что метод check сейчас выполняет функцию роутера? И что бы он стал нормальным роутером его надо вынести в другой класс, что бы он не был связан с классом Foo?

Любые комментарии приветствуются...
  • Вопрос задан
  • 817 просмотров
Решения вопроса 2
Keanor
@Keanor
Ведущий разработчик
У меня тоже такая задумка была, взял https://github.com/auraphp/Aura.Router
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы