Изучаю PHP. Столкнулся с проблемой настройки автозагрузки классов в композере. Классы App и Router загружаются, а при загрузке модели получаю ошибку:
Текст ошибки
Fatal error: Uncaught Error: Class 'MainController' not found in D:\OpenServer\domains\cms\app\core\Router.php:74 Stack trace: #0 D:\OpenServer\domains\cms\app\App.php(39): Cms\App\Core\Router->getController() #1 D:\OpenServer\domains\cms\public\index.php(12): Cms\App\App->run() #2 {main} thrown in D:\OpenServer\domains\cms\app\core\Router.php on line 74
Это ошибка в namespace? И если да, как её поправить?
Структура проекта:
cms
|-app
|-config
routes.php
|-controllers
MainController.php
|-models
|-core
Router.php
App.php
|-public
index.php
Файл composer.json
{
"autoload": {
"psr-4": {
"Cms\\": "",
"Cms\\App\\": "/app/",
"Cms\\App\\Controller\\": "/app/controller"
}
}
}
Файл index.php
<?php
use Cms\App\App;
//для разработки, потом убрать
ini_set('display_errors', 1);
error_reporting(E_ALL);
define('ROOT', __DIR__ . '/');
require_once ROOT . '../vendor/autoload.php';
(new App())->run();
Файл App
<?php
namespace Cms\App;
use Cms\App\Core\Router;
class App
{
private $routes;
private $pathRoutes;
private $router;
private $controller;
private $action;
/**
* App constructor.
* @param string $pathRoutes
*/
function __construct($pathRoutes = '/config/routes.php')
{
$this->pathRoutes = $this->getPath($pathRoutes);
$this->routes = require_once($this->pathRoutes);
}
/**
* @param string $path
* @return string
*/
function getPath(string $path): string
{
return str_replace('\\', '/', __DIR__ . $path);
}
public function run()
{
$this->router = (new Router($this->routes));
$this->controller = $this->router->getController();
$this->action = $this->router->getAction();
call_user_func([$this->controller, $this->action]);
}
}
Файл Router.php
<?php
namespace Cms\App\Core;
use Cms\App\Controllers;
class Router
{
private $uri;
private $routes;
private $controller;
private $model;
private $action;
private $namespaceControllers = 'Controllers\\';
/**
* Router constructor.
* @param $routes
*/
function __construct(array $routes = [])
{
$this->routes = $routes;
$this->uri = $this->getURI();
$this->run();
}
private function run()
{
foreach ($this->routes as $uriPattern => $path) {
if ($uriPattern === $this->uri) {
$segment = explode('/', $path);
$model = ucfirst($segment[0]) . 'Model';
$modelPath = __DIR__ . '/../models/' . $model . '.php';
$this->validNameControllerModel($modelPath, $model, $this->model);
$controller = ucfirst(array_shift($segment)) . 'Controller';
$controllerPath = __DIR__ . '/../controllers/' . $controller . '.php';
$this->validNameControllerModel($controllerPath, $controller, $this->controller);
break;
}
}
if (empty($this->controller)) {
$this->controller = 'ErrorController';
$this->action = 'indexAction';
}
}
/**
* @param $path
* @param $nameObj
* @param $obj
*/
private function validNameControllerModel($path, $nameObj, &$obj)
{
if (file_exists($path)) {
$obj = $nameObj;
} else {
$obj = null;
}
}
private function getURI()
{
return strtolower(trim($_SERVER['REQUEST_URI']));
}
public function getController()
{
$path = $this->namespaceControllers . $this->controller;
//return (new $path);
return (new $this->controller());
//return new Controllers\MainController();
}
public function getAction()
{
return $this->action;
}
}
MainController
<?php
namespace Cms\App\Controllers;
class MainController
{
function __construct()
{
echo 'work';
}
public function indexAction() {
echo "Hello from Main Controller";
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Я фрилансер, выполняю заказПроект писал не я, от меня требуется только написать авторизацию/регистрацию и мелкие фишки для сайта, работа...
появилась нужда в реализации, ночного режима на сайте, для этого нужно, что бы в методе происходила проверка (if), на время суток, то есть если...
Сайт на WordPressВ настройках Permalinks стоит опция Plain, то есть адреса страниц имеют вид https://site