Я создал каталог 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');