Laravel psr-4不能自动加载

时间:2014-08-26 06:46:19

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

我有一个Laravel项目在本地工作正常(Mavericks),但psr-4下的类不能加载到我们的舞台服务器(CentOS)上。我找不到反思"没有找到课程"每次我尝试编辑器更新或运行工匠命令时都会出错。

我所有特定于应用程序的类都存储在app / heatherland下的Laravel项目中,例如:

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选项运行作曲家更新,但工匠仍然无法运行
  • 文件夹名称是小写的,我尝试更改它们以反映命名空间的情况(编辑:这从未发生过,至少没有成功)。
  • 我尝试从命名空间中删除CamelCase(例如,将其更改为Heatherland),并且我的任何文件夹/文件名中都没有任何下划线。
  • 我正在运行PHP 5.4.30,而作曲家是最新的。我的本地设置和舞台服务器上的版本相同。 Laravel 4.1.30。
  • 两个系统中没有重复的composer.phar

欢迎任何新的建议。在这一点上,如果我做了些傻话,我会非常高兴。

2 个答案:

答案 0 :(得分:9)

PSR-4对于案件来说确实超级敏感,比Laravel本身更为敏感。完整文件夹路径和名称必须与命名空间的大小写相同。案例不需要相同的唯一地方是composer.json的PSR-4部分中有引用的地方。

这只会导致特定于案例的操作系统出现问题。我的Mac上没有问题,但CentOS拒绝播放。

请注意,这与在其文档中使用特定于Laravel的框架的做法不同,后者使用小写文件夹路径和CamelCase名称空间。这不会导致任何操作系统出现任何问题。 2015年7月ETA:此信息适用于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。提前转储,经常转储。

答案 1 :(得分:1)

名称空间,文件夹和文件名区分大小写。

如果您拥有“ App \ website”,则必须在php文件中调用它。 “ App \ website” 是正确的,但“ App \ Website” strong>是错误的