PSR-4自动加载不起作用

时间:2014-06-30 17:50:04

标签: php laravel laravel-4 autoload psr-4

我创建了一个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');

但每当我尝试访问'backend / modules / module-name'时,我会收到一条ReflectionException,其中包含以下消息:

Class Modules\ModuleName\Controllers\BackendController does not exist

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

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

2 个答案:

答案 0 :(得分:14)

来自PSR-4 specification

  

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

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

所以它变成了:

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

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

答案 1 :(得分:5)

你应该看看大写。

可能你在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');