FreshMeatInIT
@FreshMeatInIT
В замкнутом кругу

Почему на хостинге не видит класс?

Сделал сайт по паттерну проектирования 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


Вот структура проекта:
5f90782f154ae647520277.png
В проекте использую автозагрузчик 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;
    }
}
  • Вопрос задан
  • 243 просмотра
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
The file name MUST match the case of the terminating class name.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Sanes
@Sanes
Если делали на Windows, то там слеши по-другому ставятся. Точно не скажу по вашему коду, т.к. всегда собираю на хостинге.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽