@Dreaded

Как правильно настроить роутинг в своём проекте?

Я пишу свой небольшой учебный проект с нуля, не используя фреймворк. К сожалению, не смог найти какой то однозначной информации, по поводу того как правильно настроить роутинг.

В принципе, при ожидаемом поведении - всё работает.
Но если, например, обратится к файлу index.php напрямую - возникнет ошибка(ровно как и к любому другому php фалу). Если обратится к какой-либо папке - то доступ в неё тоже будет, а значит уже возможно будет посмотреть структуру проекта.
Даже при написании просто случайных символов в адресую строку - роутер попытается выполнить соответствующий метод.

Хотелось бы избавится от этих недочётов, что бы при обращении к несуществующим или не указанным в маршрутах файлам папкам перебрасывало, например, на главную страничку.

Ниже прикладываю содержимое роутера, маршрутов и .htaccess.
routes.php:

return array(
        'ajax/delFile/([0-9]+)' => 'ajax/delFile/$1',
        'ajax/delMessage/([0-9]+)' => 'ajax/delMessage/$1',
        'ajax/addPost/([0-9]+)' => 'ajax/addPost/$1',
        'ajax/addPost' => 'ajax/addPost',
        'editMessage/([0-9]+)' => 'message/editMessage/$1',
        'message/search' => 'message/searchMessage',
        'logout' => 'logout/logout',
        'ajax/register' => 'ajax/registerUser',
        'ajax/login' => 'ajax/loginUser',
        'sign-up' => 'signup/show',
        'message/([0-9]+)' => 'message/show/$1',
        '' => 'index/showAllMessages',
    );


Router:

class Router
    {
        private  $routes;
    
        public function __construct()
        {
            $routesPath = __DIR__ . '/../../App/Config/routes.php';
            $this->routes = require_once ($routesPath);
        }
    
        /**
         * Получаем строку запроса
         *
         * @return bool|string Строка запроса, либо false если строка запроса отсутствует
         */
        private function getURI()
        {
            if (!empty($_SERVER['REQUEST_URI'])) {
                return trim(str_replace('mvcguestbook', '', $_SERVER['REQUEST_URI']), '/');
            } else {
                return false;
            }
        }
    
    
        public function run()
        {
            $uri = $this->getURI();
    
            //Проверяем наличие запроса в routes.php
            foreach ($this->routes as $uriPattern => $path) {
    
                //Ищем в URI совпадение с регулярным выражением uriPattern
                if(preg_match("~$uriPattern~i", $uri)) {
    
                    //Формируем из URI внутренний маршрут
                    $internalRoute = preg_replace("~$uriPattern~i", $path, $uri);
    
                    //Определяем контроллер, экшн и параметры
                    $segments = explode('/', $internalRoute);
    
                    $controllerName = 'App\\Controllers\\' . ucfirst(array_shift($segments) . 'Controller');
                    $actionName = 'action'. ucfirst(array_shift($segments));
    
                    $controllerObject = new $controllerName;
                    $result = $controllerObject->$actionName($segments);
                    if ($result != null) {
                        break;
                    }
                }
            }
        }
    }


.htaccess:

AddDefaultCharset utf-8
    
    RewriteEngine on
    RewriteBase /mvcguestbook
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php

  • Вопрос задан
  • 200 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Yan-s
Читаем https://www.phptherightway.com/
Читаем php.net/manual/ru/language.oop5.autoload.php
Гуглим PSR autoload
Лучше откажитесь от apache в пользу nginx
Точка входа из веб (index.php) должна быть вынесена в субдиректорию. Из веб должен быть доступ исключительно к этой папке, все остальные php файлы выше по уровню.

Я пишу свой небольшой учебный проект с нуля, не используя фреймворк

Учебный проект посвящен какой цели? Велосипедостроению плохих идей? Это не приблизит вас ни к чему реалистичному, бесполезный опыт.

Прежде чем что то писать самому всегда проводится исследования того что уже существует и как именно это работает. Осмысляется, только тогда можно писать свой вариант.

Фактически вы заходите с обратной стороны. В учебных целях сперва учатся использовать инструменты, затем профессионально их применять, а только потом, когда вы прекрасно понимаете их детальное устройство, область и нюансы применения, уже можно заняться созданием своих собственных.

Если вы решите самостоятельно изготовить пилу-болгарку из вентилятора и скоча, всё чему вы в итоге научитесь - это была плохая идея.
Ответ написан
Ваш ответ на вопрос

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

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