@dj_maestro

В правильном ли направлении строится система роутингов?

Господа, доброго времени суток. Будьте добры, помогите разобраться в направлении PHP ООП. Есть класс Roure и в данной реализации он работает! ( обрабатывает URI ). Он вызывает контроллеры и методы которые описаны в $_GET запросе. НЕ уверен что всё правильно сделано.... Опыт не большой...

<?php
namespace core\Controllers;

class Route {

    public $uri;
    public $controller;
    public $action;

    public function __construct(){

        $url = htmlspecialchars( trim( parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)) );

            if (substr($url, -1)=='/') {
                $this->uri = substr($url, 0, -1);
            } else {
                $this->uri = $url;
            }
    }

    public function get( $pathUrl, $nameController, $action ) {

        if ($pathUrl == $this->uri) {

            $str = __DIR__.'/../../App/Controllers/'.$nameController.'.php';
            $pathClass = str_replace('/', '\\', $str);

            if ( file_exists( $pathClass ) ){

                $str2 = 'App\\Controllers\\'.$nameController;

                $this->controller = new $str2();

                if ( method_exists($this->controller, $action) ){

                    return $this->controller->$action();

                } else {

                    echo 'Не найден метод класса-контроллера';
                }

            } else {

                echo 'Не найден контроллер';
            }
        } else {
            echo 'Не равен';
        }

    }

}
  • Вопрос задан
  • 173 просмотра
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
Направление более-менее правильное, но путь еще предстоит большой.

Что в роутинге делают htmlspecialchars и trim? Если в запросе пришел мусор, лучше не устраивать лотерею, а честно показывать 404. По крайней мере поначалу.

str_replace('/', '\\', $str)
Тестовый сервер на windows? В последствии он только на windows и будет крутится?
(Хинт: есть такая штука как DIRECTORY_SEPARATOR)

Переменные с названиями $str и $str2 пораюдуют вас, когда вы попытаетесь вспомнить что делает этот код всего-лишь через полгодика.

if (file_exists ...
Не лучше ли поручить подключение классов автолоадеру? Он специально для таких случаев и придуман.

Ну и echo с выводом ошибок в браузер - это жесть. Надеюсь, что это временная заглушка.
Ответ написан
Falseclock
@Falseclock
решаю нестандартные задачи
Как уже сказал Stalker_RED направление правильное, но надо еще больше отделить мух от котлет.

Если ваш класс занимается как бы рутингом, то он и должен только этим заниматься. То есть он обязан вернуть только инстанс класса тому, кто его запрашивает. А тот кто вызывает проверяет нужный ли инстанс он вообще получил и что с ним дальше делать.

А вы вместо этого вы вызываете $action, делая медвежью услугу.

А вдруг вам завтра надо будет не сразу выводить данные в браузер, а получить контент по данному запросу? Вам придется шаманить сам рутинг и вот тут вот начнутся костыли.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
01 мая 2024, в 02:11
5000 руб./за проект
01 мая 2024, в 00:29
2000 руб./за проект
01 мая 2024, в 00:20
15000 руб./за проект