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 "приложение \ веб-сайт" - это хорошо, но "приложение \ веб-сайт" неверно