Где ошибка в роутере, почему метод контроллера вызывается 3 раза?

Роутер

<?php 

class Router
{
    private $routes;

    public function __construct()
    {
        $routesPath = ROOT.'/config/routes.php';
        $this->routes = include($routesPath);
    }

    // return request string

    private function getURI()
    {
        if (!empty($_SERVER['REQUEST_URI'])) {
            return trim($_SERVER['REQUEST_URI'], '/');
        }
    }

    public function run()
    {
        //Получить строку запросы
        $uri = $this->getURI();

        //Проверить наличие такого запроса в routes.php
        foreach ($this->routes as $uriPattern => $path) {
        
           // Сравниваем $uriPattern и $uri
            if (preg_match("~^{$uriPattern}~", $uri)) {

                //Получаем внутренний путь из внешнего согласно правилу
                $internalRoute = preg_replace("~^$uriPattern$~", $path, $uri);


                //Определить какой контроллер и action обрабатывает запрос и параметры
                
                $segments = explode('/', $internalRoute);

                $controllerName = array_shift($segments) . 'Controller';
                $controllerName = ucfirst($controllerName);

                $actionName = 'action'.ucfirst(array_shift($segments));

                $parameters = $segments;

                //Подключить файл класса контроллера
                $controllerFile = ROOT . '/controllers/' . 
                $controllerName . '.php';

                if (file_exists($controllerFile)) {
                    include_once($controllerFile);
                }  else {
                    header('HTTP/1.0 404 Not Found');
                    readfile('err404.html');
                    exit();
                }


                //Создать объект, взывать метод (т.е. action)
                $controllerObject = new $controllerName;                
                try { 
                    $result = call_user_func_array(array($controllerObject, $actionName), $parameters); 
                } catch (Exception $e) {
                    header('HTTP/1.0 404 Not Found');
                    readfile('err404.html');
                    exit();
                } 
                
                if($result != null){
                    break;
                } 
            }
        }
    }
}


В роутах запросы типа

'thank-you' => 'thankyou/view',
'article/([0-9]+)' => 'article/view/$1',

прокатывают без проблем. Но когда появляется адреса 3-его уровня, что то идет не так и методы контроллера вызываются по два - три раза, например путь

'cabinet/teacher/test/([0-9]+)' => 'cabinet/teachertest/$1',

вызывает (помимо метода из CabinetController - actionTeachertest ) три раза метод actionTeacher из того же контроллера, почему так происходит, подскажите?
  • Вопрос задан
  • 121 просмотр
Решения вопроса 1
anton_reut
@anton_reut
Начинающий веб-разработчик
Думаю проблема в том что используется array shift а не простые индексы значений, где то в этом плане косяк.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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