我有一个Laravel项目在本地(Mavericks)工作得很好,但是psr-4下的类不能在我们的舞台服务器(CentOS)上加载。每次我尝试作曲家更新或运行工匠命令时,我都会得到反射"类未找到"错误。
我所有的应用程序特定的类都存储在我的Laravel项目app/heatherland下,例如:
app/heatherland/import/ImportJob.php (file contains HeatherLandImportImportJob)
我的作曲家。Json包含以下条目:
"autoload": {
"classmap": [
"app/commands",
...
"app/database/seeds",
],
"psr-4": {
"HeatherLand\": "app/heatherland"
}
},
在本地,psr-4类被添加到vendor/composer/autoload_classmap.php中的数组中。它们没有被添加到舞台服务器上的这个文件中。如果我手动剪切和粘贴它们,工匠命令可以正常工作,但下次运行composer命令时,自动加载文件将被覆盖。本地和舞台上的autoload_psr4.php都有以下条目,对我来说看起来很好:
'HeatherLand\' => array($baseDir . '/app/heatherland'),
这是我尝试过/检查过的东西的列表:
- 类名、文件夹名、文件名的大小写一致、正确。
- 我一直在自由地使用composer dump- autolload,有和没有-o选项
- 我可以用——no-scripts选项运行composer update,但是artisan仍然不会运行
- 文件夹名称是小写的,
,我已经尝试改变它们以反映名称空间的情况(编辑:这从未发生过,至少没有成功)。 - 我试过从我的命名空间中删除CamelCase(例如,将其更改为Heatherland),并且在我的任何文件夹/文件名中都没有任何下划线。
- 我运行PHP 5.4.30,和作曲家是最新的。版本在我的本地设置和舞台服务器上是相同的。Laravel 4.1.30。
- 没有重复的作曲家。
欢迎任何新的建议。在这一点上,如果我做了一些愚蠢的事情,我会非常高兴。
PSR-4确实对大小写非常敏感,比Laravel本身更敏感。完整文件夹路径和名称必须与名称空间相同。只有在composer.json的PSR-4部分中有一个引用的地方,大小写不需要相同。
这只会成为特定于具体案例的操作系统的问题。在我的Mac上没有问题,但是CentOS拒绝播放。
注意,这与特定于larvel的框架在其文档中使用的做法不同,后者使用小写的文件夹路径和CamelCase命名空间。这不会在任何操作系统上造成任何问题。 2015年7月ETA:此信息适用于Laravel 4;看起来Laravel 5的默认文件夹结构遵循psr-4标准。
我最终得到了这样一个文件夹结构:
app/heatherland
Import
ImportJob.php
名称空间如
HeatherLandImport
和一个作曲家。根据原始问题的Json条目:
"autoload": {
"classmap": [
"app/commands",
...
"app/database/seeds",
],
"psr-4": {
"HeatherLand\": "app/heatherland"
}
},
self注意:记得运行composer dump- autolload。早转储,常转储
名称空间、文件夹和文件名区分大小写。
如果你有'Appwebsite',你必须在php文件中调用它'Appwebsite'是正确的,但'Appwebsite'是错误的