#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:
Все имена классов ДОЛЖНЫ указываться с учетом регистра.
Поэтому вам нужно переименовать ваши 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 проблема решена… какая глупая ошибка …. 🙁