Composer autoload class

234
07 января 2022, 13:40

Изучаю 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";
  }
}
READ ALSO
Не понимаю, как запустить проект на node js

Не понимаю, как запустить проект на node js

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

148
Сравнивать время суток (день и ночь)

Сравнивать время суток (день и ночь)

появилась нужда в реализации, ночного режима на сайте, для этого нужно, что бы в методе происходила проверка (if), на время суток, то есть если...

73
WordPress - Изменить URL одной страницы

WordPress - Изменить URL одной страницы

Сайт на WordPressВ настройках Permalinks стоит опция Plain, то есть адреса страниц имеют вид https://site

119