Почему на хостинге не видит класс?
Сделал сайт по паттерну проектирования MVC. На локальном сервере отлично работал, залил на хостинг- посыпались ошибки:
Fatal error: Uncaught Error: Class 'core\DB' not found in
/profiles/p/pr/pr0/pr0gbeg1nner/ttbj.zzz.com.ua/application/models/Model.php:11 Stack trace: #0
/profiles/p/pr/pr0/pr0gbeg1nner/ttbj.zzz.com.ua/application/controllers/IndexController.php(15):
application\models\Model->__construct() #1 /profiles/p/pr/pr0/pr0gbeg1nner/ttbj.zzz.com.ua/core/Router.php(56):
application\controllers\IndexController->__construct() #2 /profiles/p/pr/pr0/pr0gbeg1nner/ttbj.zzz.com.ua/index.php(12): core\Router::buildRoute() #3 {main} thrown
in /profiles/p/pr/pr0/pr0gbeg1nner/ttbj.zzz.com.ua/application/models/Model.php on line 11
В проекте использую автозагрузчик Composer. В силу того, что хостинг бесплатный- там нет консоли где я бы мог написать: composer install. Поэтому я сделал это на своём пк и отправил на сервер вместе со сгенерированной папкой vendor. Вот мой composer.json:
{
"name": "pr0gbeg1nner/ttbj.zzz.com.ua",
"type": "project",
"license": "MIT",
"authors": [
{
"name": "Blazhkiv Vladislav",
"email": "[email protected]"
}
],
"require": {
"php": "^5.5 || ^7.0",
"ext-mysqli": "*",
"ext-json": "*"
},
"autoload": {
"psr-4": {
"core\\": "core/",
"application\\": "application/"
}
}
}
Вот мой Router.php:
namespace core;
use application\controllers;
use application\models;
class Router
{
public static function buildRoute()
{
//контроллер по умолчанию
$controllerName = "IndexController";
$modelName = "IndexModel";
$action = "index";
$route = explode("/", $_SERVER['REQUEST_URI']);
//если URI не пустой, то определяем соотв. контроллер
if($route[1] != '')
{
if(strstr($route[1], '?') == false)
{
$controllerName = ucfirst($route[1]. "Controller");
$modelName = ucfirst($route[1]. "Model");
}
else if(strstr($route[1], 'edittask') == true)
{
$controllerName = "EdittaskController";
$modelName = "EdittaskModel";
$action = "edit";
}
else
{
$controllerName = "IndexController";
$modelName = "IndexModel";
$action = "index";
$_GET['page'] = stristr($route[1], '=');
}
}
if(file_exists( __DIR__.'/../application/controllers/'.$controllerName.'.php'))
{
include __DIR__.'/../application/controllers/'.$controllerName.'.php';
include __DIR__.'/../application/models/'.$modelName.'.php';
}
else
{
Router::errorPage();
}
if(isset($route[2]) && $route[2] != '')
{
$action = $route[2];
}
$controllerName = '\\application\\controllers\\'.$controllerName;
$controller = new $controllerName();
$controller->$action();
}
public static function errorPage()
{
header("HTTP/1.1 404 Not Found");
die();
}
}
Вот Model.php (родительский класс для всех моделей):
namespace application\models;
use core\DB as DB;
class Model
{
protected $db = null;
public function __construct()
{
$this->db = DB::connectToDB();
}
}
В нём происходит вызов класса DB, где и подключается база данных. Но тут автозагрузчик почему-то этот класс просто не видит. Вот сам класс DB.php:
namespace core;
require_once __DIR__.'/../vendor/autoload.php';
class DB
{
const host = "http://ttbj.zzz.com.ua/";
const user = "pr0gbeg";
const pass = "*пароль (правильный)*";
const dn_name = "pr0gbeg1nner";
public static function connectToDB()
{
$user = self::user;
$pass = self::pass;
$host = self::host;
$db = self::dn_name;
$conn = new \PDO("mysql:dbname=$db;host=$host", $user, $pass);
$conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
return $conn;
}
}
Ответы (2 шт):
Какие файлы должны загружаться сохраняется в
vendor/composer
vendor/autoload.php
после composer install
Видимо, не все файлы были загружены. Если код идентичен локальному, то все должно работать.
Оказывается, в силу того, что я в composer.json использовал стандарт "psr-4" то нужно, чтобы обязательно название файла совпадало с названием класса даже регистром. У меня на Windows всё отлично работало, потому что, видимо, там нет чувствительности системы к регистру при автозагрузке файлов (единственное, как я могу это объяснить, конечно же, поправьте меня, если я не прав). А на хостинге, похоже, используется UNIX-подобная OS, которая чувствительная к регистру. А у меня как раз файл dp.php в нижнем регистре, а класс DBв верхнем. Когда я это пофиксил (переименовал файл в верхний регистр)- всё сработало.
