Laravel psr-4 не загружается автоматически

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

Все мои классы, специфичные для приложения, хранятся в моем проекте 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 dump-autoload с параметром -o и без него
  • Я могу запустить composer update с параметром --no-scripts нормально, но artisan по-прежнему не запускается
  • Имена папок в нижнем регистре, , и я попытался изменить их, чтобы отразить регистр пространств имен (редактировать: этого никогда не было, по крайней мере, не успешно).
  • Я попытался удалить CamelCase из своего пространства имен (например, изменив его на Heatherland), и ни в одной из моих папок / имен файлов нет подчеркивания.
  • Я использую PHP 5.4.30, и композитор обновлен. Версии идентичны на моей локальной установке и на сценическом сервере. Laravel 4.1.30.
  • Нет дубликатов composer.phar ни в одной из систем

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


person Heather Gaye    schedule 26.08.2014    source источник
comment
Дело не в том. Путь называется import / ImportJob.php, а имя класса - Import / ImportJob в верхнем регистре. Либо исправьте имя папки, чтобы оно было идентично префиксу класса, либо исправьте PSR-4, чтобы конкретно указать "HeatherLand\\Import\\":"app/heatherland/import" для этого префикса пространства имен.   -  person Sven    schedule 26.08.2014
comment
Ха, я уже пробовал изменить несколько имен папок, но, видимо, я так и не смог получить полную комбинацию изменения имени папки и автозагрузки дампа в правильном порядке, или, возможно, три разных окна терминала были слишком трудными для моего туманного мозга, чтобы справиться . Вкратце: исправление регистра в именах папок, затем запуск composer du устранил мою проблему. Команда обновления Composer работает, как и artisan. Спасибо, Свен! Отправьте ответ, и я с радостью приму.   -  person Heather Gaye    schedule 26.08.2014


Ответы (2)


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

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

Обратите внимание, что это отличается от практики, используемой для специфической для Laravel фреймворка в его документации, где используются строчные пути к папкам и пространства имен CamelCase. Это не вызовет проблем ни в одной операционной системе. Расчетное время прибытия на июль 2015 г .: эта информация относится к 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. Делайте дамп рано, дамп часто.

person Heather Gaye    schedule 04.10.2014
comment
Просто сэкономил мне кучу времени. Спасибо! - person Aakil Fernandes; 31.01.2015
comment
Просто столкнулся с этой проблемой и нашел этот вопрос. Я также нашел параграф в спецификации PSR-4, который прямо касается этого : Смежные имена подпространств имен после префикса пространства имен соответствуют подкаталогу в базовом каталоге, в котором разделители пространства имен представляют собой разделители каталогов. Имя подкаталога ДОЛЖНО соответствовать регистру имен подпространств имен. - person Snap E Tom; 11.05.2015
comment
Идеально! Спас мой день. - person Bishal Paudel; 19.05.2015
comment
изменение имени папки с верхнего регистра на нижний регистр решает проблему загрузки класса без флага -o в composer dump-autoload. Вы можете объяснить причину? - person ssi-anik; 31.10.2015

Пространства имен, папки и имена файлов чувствительны к регистру.

Если у вас есть "Приложение \ веб-сайт", вы должны называть его в файле php. "Приложение \ веб-сайт" является правильным, но "Приложение \ веб-сайт" является неправильный

person Vahid Alvandi    schedule 25.07.2020
comment
На этот вопрос уже был дан ответ почти шесть лет назад - есть ли что-нибудь новое, что вы хотите выделить? - person Nico Haase; 25.07.2020
comment
при использовании композитора 2 отображается такое же предупреждение, и это мой опыт .. - person Vahid Alvandi; 25.07.2020
comment
Итак, ничего нового вы не хотите добавить? - person Nico Haase; 25.07.2020