Класс ‘Базовый контролер’ не найден в ‘RouteController.php»

#php #phpstorm

Вопрос:

Я начал писать сайт и столкнулся с этой проблемой. Я создал RouteController , который служит для анализа адресной строки, и создал унаследованный класс для привязки:

 protected $controller;
protected $inputMethod;
protected $outputMethod;
protected $parameters;
 

Ну, вообще говоря, базовый класс, который наследуется RouteController. Но когда я просто добавил «расширяет базовый контролер» в «класс RouteController», он сразу же начал сбоить и выдал следующую ошибку:

Неустранимая ошибка PHP: Необнаруженная ошибка: Класс «ЯдроБазаКонтроллерыБазовый контролер» не найден в /var/www/Artemiys_Shop/Ядро/База/Контроллеры/Контроллер маршрута. php:10 Трассировка стека: #0 {основная} введена /var/www/Artemiys_Shop/Core/Base/Controllers/RouteController.php на линии 10

Кто-нибудь знает, где я мог ошибиться или сделать что-то не так? У меня никогда раньше не было с этим проблем.

RouteController.php

 <?php

namespace CoreBaseControllers;

use CoreBaseExceptionsRouteException;
use CoreBaseSettingsSettings;
use CoreBaseSettingsShopSettings;


class RouteController extends BaseController
{

    static private $_instance;

    protected $routes;

    private function _clone()
    {
    }

    static public function getInstance()
    {
        if(self::$_instance instanceof self){
            return self::$_instance;
        }
        return self::$_instance = new self;
    }

    /**
     * @throws RouteException
     */

    private function _construct()
    {

        $address_str = $_SERVER['REQUEST_URI'];

        if(strpos($address_str, '/') === strlen($address_str) - 1 amp;amp; strpos($address_str, '/') !== 0){
            $this->redirect(rtrim($address_str, '/'), 301);
        }

        $path = substr($_SERVER['PHP_SELF'], 0, strpos($_SERVER['PHP_SELF'], 'index.php'));

        if($path === PATH){
            $this->routes = Settings::get('routes');
            if(!$this->routes) throw new RouteException('Website is under maintenance');
            $url = explode('/', substr($address_str, strlen(PATH)));
            if($url[0] amp;amp; $url[0] === $this->routes['admin']['alias']){
                array_shift($url);
                if($url[0] amp;amp; is_dir($_SERVER['DOCUMENT_ROOT'] . PATH . $this->routes['plugins']['path'] . $url[0])){
                    $plugin = array_shift($url);
                    $pluginSettings = $this->routes['settings']['path'] . ucfirst($plugin . 'Settings');
                    if(file_exists($_SERVER['DOCUMENT_ROOT'] . PATH . $pluginSettings . '.php')){
                        $pluginSettings = str_replace('/', '\', $pluginSettings);
                        $this->routes = $pluginSettings::get('routes');
                    }
                    $dir = $this->routes['plugins']['dir'] ? '/' . $this->routes['plugins']['dir'] . '/' : '/';
                    $dir = str_replace('//', '/', $dir);
                    $this->controller = $this->routes['plugins']['path'] . $plugin . $dir;
                    $hrUrl = $this->routes['plugins']['hrUrl'];
                    $route = 'plugins';
                }else{
                    $this->controller = $this->routes['admin']['path'];
                    $hrUrl = $this->routes['admin']['hrUrl'];
                    $route = 'admin';
                }
            }else{
                $hrUrl = $this->routes['user']['hrUrl'];
                $this->controller = $this->routes['user']['path'];
                $route = 'user';
            }
            $this->createRoute($route, $url);
            if($url[1]){
                $count = count($url);
                $key = '';
                if(!$hrUrl){
                   $i = 1;
                }else{
                    $this->parameters['alias'] = $url[1];
                    $i = 2;
                }
                for( ; $i < $count; $i  ){
                    if(!$key){
                        $key = $url[$i];
                        $this->parameters[$key] = '';
                    }else{
                        $this->parameters[$key] = $url[$i];
                        $key = '';
                    }
                }
            }

            exit();
        }else{
            try{
                throw new Exception('Incorrect directory');
            }
            catch (Exception $e){
                exit($e->getMessage());
            }
        }

    }

    private function createRoute($var, $arr){
        $route = [];
        if(!empty($arr[0])){
            if($this->routes[$var]['routes'][$arr[0]]){
                $route = explode('/', $this->routes[$var]['routes'][$arr[0]]);
                $this->controller .= ucfirst($route[0]. 'Controller');
            }else{
                $this->controller .= ucfirst($arr[0]. 'Controller');
            }
        }else{
            $this->controller .= $this->routes['default']['controller'];
        }
        $this->inputMethod = $route[1] ? $route[1] : $this->routes['default']['inputMethod'];
        $this->outputMethod = $route[2] ? $route[2] : $this->routes['default']['outputMethod'];

        return;
    }

}
 

BaseController.php

 <?php


namespace CoreBaseControllers;

use CoreBaseExceptionsRouteException;

abstract class BaseController
{

    protected $controller;
    protected $inputMethod;
    protected $outputMethod;
    protected $parameters;


    /**
     * @throws RouteException
     */

    public function route() {
        $controller = str_replace('/', '\', $this->controller);
        try {
            $object = new ReflectionMethod($controller, 'request');
            $args = [
                'parameters' => $this->parameters,
                'inputMethod' => $this->inputMethod,
                'outputMethod' => $this->outputMethod
            ];
            $object->invoke(new $controller, $args);
        }
        catch (ReflectionException $e){
            throw new RouteException($e->getMessage());
        }
    }
    public function request($args){

    }

}
 

Index.php

 <?php

define ('VG_ACCESS', true);

header('Content-Type:text/html;charset=utf-8');
session_start();

require_once 'config.php';
require_once 'Core/Base/Settings/internal_settings.php';

use CoreBaseExceptionsRouteException;
use CoreBaseControllersRouteController;


try{
    RouteController::getInstance()->route();
}
catch (RouteException $e) {
    exit($e->getMessage());
}
 

Setting.php

 <?php


namespace CoreBaseSettings;


class Settings
{

    static private $_instance;

    private array $routes = [
        'admin' => [
            'alias' => 'admin',
            'path' => 'Core/Admin/Controllers/',
            'hrUrl' => false
        ],
        'settings' => [
            'path' => 'Core/Base/Settings/'
        ],
        'plugins' => [
            'path' => 'Core/Plugins/',
            'hrUrl' => false,
            'dir' => false
        ],
        'user' => [
            'path' => 'Core/User/Controllers/',
            'hrUrl' => true,
            'routes' => [

            ]
        ],
        'default' => [
            'controller' => 'IndexController',
            'inputMethod' => 'inputData',
            'outputMethod' => 'outputData'
        ]
    ];
 

Каталоги

Веб-страница

И я хотел бы знать, почему появляется эта ошибка?

Комментарии:

1. Покажите, как вы его запускаете (скриншот). Прямо сейчас похоже, что вы пытаетесь выполнить этот класс контроллера напрямую и, следовательно, обходите свою логику фреймворка / начальной загрузки (которая включает часть автоматической загрузки класса). Если это так-это ожидаемо. Вам нужно запустить его «нормально» через свой скрипт точки входа (index.php как я понимаю).

2. Все это может быть связано с тем, что вы просто нажимаете кнопку «Выполнить», которая выполняет файл непосредственно в среде CLI (тип конфигурации запуска/отладки»PHP-скрипт»). Если это должно было выполняться в браузере (скорее всего), вам понадобится другой тип конфигурации запуска/отладки (который вы можете легко создать вручную .. или просто ввести правильный URL-адрес в своем браузере). В любом случае: требуется более подробная информация о том, как вы его запускаете и как вы хотите, чтобы он выполнялся.

3. @LazyOne я запускаю его со своего локального сервера apache (если вы об этом). Я добавил скриншот того, что происходит, пока я открываю свой веб-сайт. Мне просто интересно, проблема ли в этом коде (методе) или я все неправильно подключаю.

4. 1) Что такое URL-адрес в адресной строке? Чтобы у меня было лучшее представление о том, как вы это делаете. 2) Есть ли у вас где-нибудь код автоматической загрузки классов? Т. е. Используете ли вы Composer .. или какой-либо другой (ваш фреймворк) загрузчик классов? Или, может быть, вы используете require / include для себя классы?

5. Точка зрения, которую я пытаюсь здесь подчеркнуть: ваш PHP не знает об BaseController этом, что означает, что он не был загружен до выполнения этого RouteController .. что явно говорит о том, что у вас может не быть загрузки / требования к классу. На всякий случай: use XXX строки не будут загружать класс для вас-это просто ссылки, чтобы вы могли использовать короткое имя класса вместо FQN.