@3dben

Не видит класс. Routing?

Приветствую всех. У меня вот такая вот ошибка:
Fatal error: Class 'SiteController' not found in C:\OpenServer\domains\MVC\engine\components\Router.php on line 59


index.php
//подключаю роутер
    use engine\components\Router;

    //получаю путь C:\OpenServer\domains\MVC\
    define('ROOT', dirname(__DIR__));

   // подключаю файл функций в котором находится функция автозагрузки
    require_once '../engine/config/functions.php';

    // Создаю объект роутера и вызываю метод котором выскочила ошибка =)
    $router = new Router;
    $router->run();


functions.php
/**
 * Функция автоматичсеской загрузки классов
 */
spl_autoload_register(function ($class) {
    $file = ROOT . '/' . $class . '.php';

    if (is_file($file)) {
        require_once $file;
    }
});


routes.php Здесь хранятся маршруты

$routes = [

    '' => 'site/index',
];

return $routes;


Класс Router.php
namespace engine\components;

class Router
{

    /**
     * Свойство для хранения массива роутов
     * @var array
     */
    private $routes = [];

    /**
     * Конструктор
     */
    public function __construct()
    {
        $routesPath = ROOT . '/engine/config/routes.php';

        $this->routes = include($routesPath);
    }

    /**
     * Возвращает строку запроса
     */
    public 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 => $route ){

/ Сравниваем $uriPattern и $uri
            if (preg_match("~$uriPattern~", $uri)) {

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

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

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

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

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

                if (file_exists($controllerFile)) {
                    include_once($controllerFile);
                }
// Создать объект, вызвать метод (т.е. action)
                $controllerObject = new $controllerName;

               /* Вызываем необходимый метод ($actionName) у определенного 
                 * класса ($controllerObject) с заданными ($parameters) параметрами
                 */
                $result = call_user_func_array(array($controllerObject, $actionName), $parameters);

                if ($result != null) {
                    break;
                }
            }
        }
    }
}


Получается так что контроллер есть

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

var_dump($controllerName );


string(14) "SiteController"

Путь к контроллерам верный:

$controllerFile = ROOT . 'engine/app/controllers/' . $controllerName . '.php';
var_dump($controllerFil);


string(66) "C:\OpenServer\domains\MVCengine/app/controllers/SiteController.php"


Но при этом в этой строке он не видит класс:

// Создать объект, вызвать метод (т.е. action)
     $controllerObject = new $controllerName;


Fatal error: Class 'SiteController' not found in C:\OpenServer\domains\MVC\engine\components\Router.php on line 61


Структура проекта:
59d4fdd94523c126561247.jpeg
  • Вопрос задан
  • 553 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы