5

我创建了一个app/modules目录并使用 PSR-4 自动加载它,如下所示:

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

我也做到了composer dumpautoload。我有以下目录结构:

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

该文件BackendController.php具有命名空间Modules\ModuleName\Controllers

在 中routes.php,我有以下内容:

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

但是每当我尝试访问“后端/模块/模块名称”时,我都会收到ReflectionException以下消息:

Class Modules\ModuleName\Controllers\BackendController does not exist

什么可能导致问题?当我在本地机器上运行它时,它似乎可以工作,但我无法让它在网络服务器上工作。是否有任何可能导致此问题的服务器配置方案?

由于我没有对该网络服务器的 shell 访问权限,因此我没有在网络服务器上安装 composer,但它安装在我的本地计算机上。我已将包括vendor目录在内的所有文件上传到服务器。

4

2 回答 2

18

来自PSR-4 规范

所有类名必须以区分大小写的方式引用。

因此,您需要将您的modulescontrollers文件夹分别重命名为ModulesControllers

所以它变成:

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

我不建议将命名空间重命名为小写名称,因为这只会破坏代码和项目结构的一致性。维护和弄清楚命名空间的哪一部分需要大写,哪一部分不需要大写,这将是一件令人头疼的事情。

于 2014-06-30T17:59:02.317 回答
8

你应该看看大写。

可能你在 Windows 机器上测试它所以路径

'Modules\ModuleName\Controllers\BackendController'

是相同的

'modules\ModuleName\controllers\BackendController'

但在 Linux 上,它们是 2 条不同的路径。你可能应该改变你的routes.php线路

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

Route::resource('backend/modules/module-name', 'modules\ModuleName\controllers\BackendController');
于 2014-06-30T17:59:09.747 回答