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

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

Author: Heather Gaye, 2014-08-26

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"
    }
},

Примечание для себя: Не забудьте запустить свалка композитора- автозагрузка. Сбрасывать рано, сбрасывать часто.

 8
Author: Heather Gaye, 2015-07-28 06:04:27