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

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

Похожие вопросы