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

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

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

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

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

Файл BackendController.php имеет Modules\ModuleName\Controllers пространства имен Modules\ModuleName\Controllers .

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

 Route::resource('backend/modules/module-name', 'Modules\ModuleName\Controllers\BackendController'); 

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

 Class Modules\ModuleName\Controllers\BackendController does not exist 

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

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

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

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

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

Так оно и будет:

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

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

Вы должны посмотреть на капитализацию.

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

 'Modules\ModuleName\Controllers\BackendController' 

такой же как

 'modules\ModuleName\controllers\BackendController' 

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

 Route::resource('backend/modules/module-name', 'Modules\ModuleName\Controllers\BackendController'); 

в

 Route::resource('backend/modules/module-name', 'modules\ModuleName\controllers\BackendController');