Laravel psr-4 не загружается автоматически
У меня есть проект Laravel, который отлично работает локально (Mavericks), но классы под psr-4 не загружаются на наш сервер сцены (CentOS). Я получаю сообщение об ошибке "класс не найден" каждый раз, когда пытаюсь обновить composer или выполнить команду artisan.
Все мои классы, относящиеся к приложению, хранятся в моем проекте Laravel в разделе app/heatherland, например:
app/heatherland/import/ImportJob.php (file contains HeatherLand\Import\ImportJob)
Мой композитор.json содержит эту запись:
"autoload": {
"classmap": [
"app/commands",
...
"app/database/seeds",
],
"psr-4": {
"HeatherLand\\": "app/heatherland"
}
},
Локально классы psr-4 добавляются в массив в vendor/composer/autoload_classmap.php . Они не добавляются в этот файл на сервере сцены. Если я вырезаю и вставляю их вручную, команды artisan работают правильно, но при следующем запуске команды composer файл автозапуска перезаписывается. Тот autoload_psr4.php как на локальном, так и на этапе есть следующая запись, которая мне нравится:
'HeatherLand\\' => array($baseDir . '/app/heatherland'),
Вот список вещей, которые я пробовал/проверял:
- Случай имен классов, папок и файлов согласован и правильно.
- Я широко использую автоматическую загрузку дампа composer, как с опцией-o, так и без нее
- Я могу запустить обновление composer с опцией --no-scripts, но artisan все равно не будет запускаться
- Имена папок строчные,
, и я попытался изменить их, чтобы отразить регистр пространств имен(редактировать: этого никогда не происходило, по крайней мере, не успешно). - Я попытался удалить camelCase из своего пространства имен (например, изменив его на Heatherland), и никаких подчеркивания в любом из моих имен папок/файлов.
- Я использую PHP 5.4.30, и composer обновлен. Версии идентичны на моем локальном сервере установки и этапа. Ларавель 4.1.30.
- Ни в одной системе нет дубликата composer.phar
Любые новые советы приветствуются. В этот момент я был бы действительно счастлив, если бы сделал что-то глупое.
1 answers
PSR-4 действительно очень чувствителен к делу, больше, чем сам Ларавел. Полные пути и имена папок должны совпадать с пространствами имен. Единственные места, где случаи не должны быть одинаковыми, - это то, где есть ссылка в разделе 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"
}
},
Примечание для себя: Не забудьте запустить свалка композитора- автозагрузка. Сбрасывать рано, сбрасывать часто.