我有一个在本地运行良好的 Laravel 项目(Mavericks),但 psr-4 下的类未加载到我们的阶段服务器(CentOS)上。每次尝试作曲家更新或运行 artisan 命令时,我都会收到反射“未找到类”错误。
我所有的应用程序特定类都存储在我的 Laravel 项目中的 app/heatherland 下,例如:
app/heatherland/import/ImportJob.php (file contains HeatherLand\Import\ImportJob)
我的composer.json 包含此条目:
"autoload": {
"classmap": [
"app/commands",
...
"app/database/seeds",
],
"psr-4": {
"HeatherLand\\": "app/heatherland"
}
},
在本地,psr-4 类被添加到vendor/composer/autoload_classmap.php 中的数组中。它们不会添加到阶段服务器上的此文件中。如果我手动剪切和粘贴它们,artisan 命令可以正常工作,但下次运行 Composer 命令时,自动加载文件将被覆盖。本地和舞台上的 autoload_psr4.php 都有以下条目,对我来说看起来不错:
'HeatherLand\\' => array($baseDir . '/app/heatherland'),
这是我尝试过/检查过的内容的列表:
- 类、文件夹和文件名的大小写一致且正确。
- 我一直在自由地使用 Composer dump-autoload,无论是否带有 -o 选项
- 我可以使用 --no-scripts 选项运行作曲家更新,但 artisan 仍然无法运行
- 文件夹名称是小写的,
并且我尝试更改它们以反映命名空间的大小写(编辑:这从未发生过,至少没有成功)。
- 我尝试从我的命名空间中删除 CamelCase(例如,将其更改为 Heatherland),并且我的任何文件夹/文件名中都没有任何下划线。
- 我正在运行 PHP 5.4.30,并且 Composer 是最新的。我的本地设置和阶段服务器上的版本是相同的。 Laravel 4.1.30。
- 两个系统中都没有重复的composer.phar
欢迎任何新的建议。在这一点上,如果我做了一些愚蠢的事情,我会非常高兴。
PSR-4 确实对大小写非常敏感,比 Laravel 本身还要敏感。完整文件夹路径和名称必须与命名空间相同。唯一不需要相同的地方是在composer.json 的PSR-4 部分中有引用的地方。
这只会成为特定情况操作系统的问题。我在 Mac 上没有问题,但 CentOS 拒绝玩。
请注意,这与 Laravel 特定框架在其文档中使用的做法不同,后者使用小写文件夹路径和 CamelCase 命名空间。这不会在任何操作系统上造成任何问题。2015 年 7 月预计到达时间:此信息适用于 Laravel 4;看起来 Laravel 5 默认文件夹结构遵循 psr-4 标准。
我最终得到了一个像这样的文件夹结构:
app/heatherland
Import
ImportJob.php
命名空间例如
HeatherLand\Import
以及按照原始问题的composer.json条目:
"autoload": {
"classmap": [
"app/commands",
...
"app/database/seeds",
],
"psr-4": {
"HeatherLand\\": "app/heatherland"
}
},
自我提示:记住运行composer dump-autoload。尽早倾倒,经常倾倒。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)