Не работает автозагрузка PSR-4

#php #laravel #laravel-4 #autoload #psr-4

#php #laravel #laravel-4 #автозагрузка #psr-4

Вопрос:

Я создал app/modules каталог и загрузил его автоматически с помощью PSR-4 следующим образом:

 "psr-4": {
    "Modules\": "app/modules"
}
  

И я тоже это сделал composer dumpautoload . У меня следующая структура каталогов:

 app
- ...
- modules
-- ModuleName
--- controllers
---- BackendController.php
...
  

Файл BackendController.php имеет пространство имен ModulesModuleNameControllers .

И в routes.php у меня есть следующее:

 Route::resource('backend/modules/module-name', 'ModulesModuleNameControllersBackendController');
  

Но всякий раз, когда я пытаюсь получить доступ к ‘backend / modules / module-name’, я получаю ReflectionException следующее сообщение:

 Class ModulesModuleNameControllersBackendController does not exist
  

Что может быть причиной проблемы? Когда я запускаю его на своем локальном компьютере, кажется, что он работает, но я не могу заставить его работать на веб-сервере. Существуют ли какие-либо сценарии конфигурации сервера, которые могут вызывать эту проблему?

Поскольку у меня нет доступа оболочки к этому веб-серверу, у меня не установлен composer на веб-сервере, но он установлен на моем локальном компьютере. Я загрузил все файлы, включая vendor каталог, на сервер.

Комментарии:

1. Попробуйте заглавными буквами controllers папку Controllers .

Ответ №1:

Из спецификации PSR-4:

Все имена классов ДОЛЖНЫ указываться с учетом регистра.

Поэтому вам нужно переименовать ваши modules и controllers папки в Modules и Controllers соответственно.

Таким образом, становится:

 app
- ...
- Modules
-- ModuleName
--- Controllers
---- BackendController.php
...
  

Я бы не рекомендовал переименовывать ваши пространства имен в имена в нижнем регистре, потому что это просто нарушает согласованность вашего кода и структуры проекта. Поддерживать и выяснять, какая часть вашего пространства имен должна быть заглавной, а какая нет, будет головной болью.

Комментарии:

1. Спасибо за ответ. Я забыл о case-sensitivity .

2. Я только что понял, что в спецификации указано «имена классов». Я понятия не имею, имели ли они в виду имена пространств имен в первую очередь. Ну что ж, это самое близкое разъяснение.

Ответ №2:

Вам следует обратить внимание на заглавные буквы.

Вероятно, вы тестируете его на компьютере с Windows, поэтому путь

 'ModulesModuleNameControllersBackendController'
  

это то же самое, что

 'modulesModuleNamecontrollersBackendController'
  

Но в Linux это 2 разных пути. Вероятно, вам следует изменить в своей routes.php строке с

 Route::resource('backend/modules/module-name', 'ModulesModuleNameControllersBackendController');
  

Для

 Route::resource('backend/modules/module-name', 'modulesModuleNamecontrollersBackendController');
  

Комментарии:

1. Вот что было не так с моим кодом и настройкой. Я думал, что автозагрузчик позаботится об этом. Наверное, я был неправ. Спасибо за ответ.

2. У меня была такая же проблема, но пути в нижнем регистре действительно работали в Linux — по крайней мере, я ТАК ДУМАЛ! Оказалось, что я тестировал внутри Vagrant box, который отображал пути к моему хост-компьютеру OS X, который, в свою очередь, использует файловую систему без учета регистра. Поймал это во время производственного развертывания 🙂

3. спасибо за ваш comment…my проблема решена… какая глупая ошибка …. 🙁