#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.