【问题标题】:PSR-4 autoloading not workingPSR-4 自动加载不工作
【发布时间】:2014-08-21 04:05:42
【问题描述】:

我创建了一个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 目录在内的所有文件上传到服务器。

【问题讨论】:

  • 尝试将controllers文件夹大写为Controllers

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


【解决方案1】:

来自PSR-4 specification

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

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

这样就变成了:

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

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

【讨论】:

  • 感谢您的回答。我忘了case-sensitivity
  • 我刚刚意识到规范说的是“类名”。我不知道他们是否打算首先表示名称空间名称。但是哦,好吧,这是最接近的澄清。
【解决方案2】:

你应该看看大小写。

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

【讨论】:

  • 这就是我的代码和设置有问题的地方。我认为自动加载器会处理好这个问题。我想我错了。谢谢你的回答。
  • 我遇到了同样的问题,但小写路径实际上在 Linux 中工作 - 或者我这么认为!事实证明,我在一个 Vagrant 盒子内进行测试,该盒子将路径映射到我的主机 OS X 机器——它又使用不区分大小写的文件系统。在生产部署期间捕获它:)
  • 感谢您的评论...我的问题解决了...多么愚蠢的错误.... :(
猜你喜欢
  • 2016-03-31
  • 2016-10-31
  • 2014-10-19
  • 2015-01-08
  • 1970-01-01
  • 2015-03-28
  • 2014-07-25
  • 2015-07-31
  • 2023-01-31
相关资源
最近更新 更多