Проблема с автозагрузчиком при развертывании веб-сайта php на героку

У меня возникли проблемы с правильной работой функции автозагрузчика, когда мой php-код развернут на героку. Я использую пространства имен.

Структура файла

журнал Heroku

На локалхосте работает корректно. Я уже внес изменения, необходимые для перевода путей с локального хоста на героку, так как героку использует /app в качестве корня документа. Таким образом, в приведенном ниже случае для BASEURL установлено значение:

define('BASEURL', $_SERVER['DOCUMENT_ROOT']); 

Вот часть файла инициализации:

spl_autoload_register('myAutoLoaderPerson');

function myAutoLoaderPerson($className) {
    $path = BASEURL . '/classes/';      
    $extension = '.class.php';
    $fullPath = $path . $className . $extension;        

    require $fullPath;
}

Что я делаю не так?


person Miguel Pereira    schedule 25.02.2020    source источник


Ответы (1)


Вы уверены, что $_SERVER['DOCUMENT_ROOT']) заполнен правильно?

Я бы рекомендовал определить BASEURL, используя относительное определение, например, если Корень документа находится на две папки выше файла, определяющего BASEURL:

define('BASEURL', realpath(__DIR__ . "/../../"));

Или упростив свой автозагрузчик, сделать путь относительным от него:

spl_autoload_register('myAutoLoaderPerson');

function myAutoLoaderPerson($className) {
    require_once __DIR__ . "/../../../classes/$className.class.php";
}

Вы предложили вернуть /app/classes/lib\foo.class.php.

Обратите внимание на сочетание / и \. Возможно, разница заключается в том, что вы используете windows локально, но на linux удаленно.

Если вы следуете соглашению PSR-4, это означает, что ваши пространства имен должны сопоставлять каталоги, но для этого вам, вероятно, потребуется преобразовать \ в /.

Может быть так:

spl_autoload_register('myAutoLoaderPerson');

function myAutoLoaderPerson($className) {
    require_once __DIR__ . "/../<path..to>/classes/" . strtr($classname, "\\", "/") . ".class.php";
}


person Patrick Allaert    schedule 25.02.2020
comment
Сейчас пробую, пока не получается. В любом случае, если вы сравните журнал heroku и изображения файловой структуры, которые я разместил выше, * я думаю *, что пути связаны правильно. Пространства имен должны работать одинаково на локальном хосте и в героку, верно? - person Miguel Pereira; 25.02.2020
comment
До сих пор нет кости. Каждое предложение при правильном применении просто возвращает /app/classes/lib\foo.class.php в журналах, что должно быть правильным путем. Может ли быть проблема с пространством имен? ПОМОГИТЕ, я хочу опубликовать это, я хочу получить работу ;) - person Miguel Pereira; 25.02.2020
comment
Проклятый человек, наконец. Кроме того, это имеет смысл. Я не знал о несоответствии Windows-Linux. Большое спасибо, что нашли время, чтобы помочь мне!! - person Miguel Pereira; 25.02.2020
comment
Сделанный. Все еще новичок в стеке, еще одна вещь, которую я узнал, я думаю :) - person Miguel Pereira; 25.02.2020