Laravel psr-4 не автозагрузка

У меня есть проект Laravel, который отлично работает локально (Mavericks), но классы в psr-4 не загружаются на наш сервер этапа (CentOS). Я получаю ошибку Reflection "class not found" каждый раз, когда я пытаюсь обновить композитора или выполнить команду кустарного мастера.

Все мои классы для приложений хранятся в моем проекте Laravel в app/heatherland, например:

app/heatherland/import/ImportJob.php (file contains HeatherLand\Import\ImportJob)

Мой composer.json содержит эту запись:

"autoload": {
    "classmap": [
        "app/commands",
        ...
        "app/database/seeds",
    ],
    "psr-4": {
        "HeatherLand\\": "app/heatherland"
    }
},

Локально классы psr-4 добавляются в массив в vendor/composer/autoload_classmap.php. Они не добавляются в этот файл на сервере сцены. Если я вырезал и вставил их вручную, команды кустарного промысла работают должным образом, но при следующем запуске команды композитора файл автозагрузки будет перезаписан. В файле autoload_psr4.php на локальном компьютере и на сцене есть следующая запись, которая мне подходит:

'HeatherLand\\' => array($baseDir . '/app/heatherland'),

Вот список вещей, которые я пробовал / проверял:

  • Случай с именем класса, папки и файла является последовательным и правильным.
  • Я использую дамп-автозагрузку composer свободно, с опцией -o и без нее
  • Я могу запустить обновление композитора с опцией --no-scripts, но ремесленник все равно не запустится
  • Имена папок в нижнем регистре, и я попытался изменить их, чтобы они соответствовали регистру пространств имен (правка: это никогда не происходило, по крайней мере, не успешно).
  • Я попытался удалить CamelCase из своего пространства имен (например, изменив его на Heatherland), и в моих папках / именах файлов нет подчеркивания.
  • Я использую PHP 5.4.30, и composer обновлен. Версии идентичны на моем локальном сервере установки и стадии. Ларавел 4.1.30.
  • Нет дубликата composer.phar в любой системе

Любые новые советы приветствуются. На этом этапе я был бы очень счастлив, если бы сделал что-то глупое.

1 ответ

Решение

PSR-4 действительно супер-обидчив в корпусе, в большей степени, чем сам Laravel. Полные пути и имена папок должны быть в том же регистре, что и пространства имен. Единственные места, где дела не обязательно должны быть одинаковыми, - это ссылка в разделе PSR-4 файла composer.json.

Это становится проблемой только для конкретных операционных систем. У меня не было проблем на моем Mac, но CentOS отказывался играть.

Обратите внимание, что это отличается от практики, используемой для специфической для Laravel инфраструктуры в ее документации, которая использует пути к папкам в нижнем регистре и пространства имен CamelCase. Это не вызовет проблем в любой операционной системе.Июль 2015 ETA: эта информация относится к Laravel 4; похоже, что структура папок по умолчанию в Laravel 5 соответствует стандартам psr-4.

В итоге я получил структуру папок:

app/heatherland
  Import
    ImportJob.php

пространства имен, например

HeatherLand\Import

и запись composer.json в соответствии с исходным вопросом:

"autoload": {
    "classmap": [
        "app/commands",
        ...
        "app/database/seeds",
    ],
    "psr-4": {
        "HeatherLand\\": "app/heatherland"
    }
},

Примечание для себя: не забудьте запустить composer dump-autoload. Дамп рано, дамп часто.

Может отличаться пространство имен и заглавные буквы

если на самом деле у вас есть "приложение \ веб-сайт", вы должны называть его в файле php "приложение \ веб-сайт" - это хорошо, но "приложение \ веб-сайт" неверно

Другие вопросы по тегам