Сделал сайт по паттерну проектирования 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": "olegovich.vladislav@yahoo.com"
}
],
"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;
}
}