Приветствую всех. У меня вот такая вот ошибка:
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.phpnamespace 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
Структура проекта: