PSR-4自动加载不起作用

SUB*_*0DH 4 php autoload laravel laravel-4 psr-4

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

"psr-4": {
    "Modules\\": "app/modules"
}
Run Code Online (Sandbox Code Playgroud)

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

app
- ...
- modules
-- ModuleName
--- controllers
---- BackendController.php
...
Run Code Online (Sandbox Code Playgroud)

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

routes.php,我有以下内容:

Route::resource('backend/modules/module-name', 'Modules\ModuleName\Controllers\BackendController');
Run Code Online (Sandbox Code Playgroud)

但每当我尝试访问'backend/modules/module-name'时,我都会收到ReflectionException以下消息:

Class Modules\ModuleName\Controllers\BackendController does not exist
Run Code Online (Sandbox Code Playgroud)

可能导致问题的原因是什么?当我在我的本地机器上运行它时,它似乎工作,但我不能让它在Web服务器上工作.是否存在任何可能导致此问题的服务器配置方案?

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

Unn*_*wut 14

PSR-4规格:

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

所以,你需要将自己的重命名modulescontrollers文件夹,ModulesControllers分别.

所以它变成:

app
- ...
- Modules
-- ModuleName
--- Controllers
---- BackendController.php
...
Run Code Online (Sandbox Code Playgroud)

我不建议将名称空间重命名为小写名称,因为这会破坏代码和项目结构的一致性.维护并弄清楚命名空间的哪一部分需要大写,而哪一部分不需要,这将是一个令人头痛的问题.


Mar*_*łek 6

您应该查看大写。

可能您在Windows计算机上对其进行了测试,因此路径

'Modules\ModuleName\Controllers\BackendController'
Run Code Online (Sandbox Code Playgroud)

是相同的

'modules\ModuleName\controllers\BackendController'
Run Code Online (Sandbox Code Playgroud)

但是在Linux上,它们是两条不同的路径。您可能应该routes.php

Route::resource('backend/modules/module-name', 'Modules\ModuleName\Controllers\BackendController');
Run Code Online (Sandbox Code Playgroud)

Route::resource('backend/modules/module-name', 'modules\ModuleName\controllers\BackendController');
Run Code Online (Sandbox Code Playgroud)