8

我有一个在本地运行良好的 Laravel 项目(Mavericks),但是 psr-4 下的类没有加载到我们的舞台服务器(CentOS)上。每次我尝试作曲家更新或运行工匠命令时,都会收到反射“找不到类”错误。

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

欢迎任何新的建议。在这一点上,如果我做了一些愚蠢的事情,我会很高兴。

4

2 回答 2

15

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。早点倾倒,经常倾倒。

于 2014-10-04T23:40:50.733 回答
3

命名空间、文件夹和文件名区分大小写。

如果你有 'App\website' 你必须在 php 文件中调用它 'App\website'是正确的但 'App\Website'是错误的

于 2020-07-25T16:07:20.857 回答