Laravel psr-4 不自动加载

Posted

技术标签:

【中文标题】Laravel psr-4 不自动加载【英文标题】:Laravel psr-4 not autoloading 【发布时间】:2014-10-19 09:55:57 【问题描述】:

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

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

【问题讨论】:

大小写不正确。路径名为“import/ImportJob.php”,而类名是大写的“Import/ImportJob”。要么将文件夹名称修复为与类前缀相同,要么将 PSR-4 修复为专门为该命名空间前缀指定 "HeatherLand\\Import\\":"app/heatherland/import" 哈,我已经尝试过更改一些文件夹名称,但显然我从来没有完全按照正确的顺序获得文件夹名称更改和转储自动加载的完整组合,或者可能是三个不同的终端窗口太多了,我迷糊的大脑无法处理。简而言之:更正文件夹名称的大小写,然后运行 ​​composer du 解决了我的问题。作曲家更新命令有效,工匠也是如此。谢谢,斯文!发表回复,我很乐意接受。 【参考方案1】:

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

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

【讨论】:

这个问题在将近六年前就已经得到了回答——您有什么新的想强调的吗? 使用 composer 2 时会显示相同的警告,这是我的经验.. 那么,你没有什么新东西要添加的吗?【参考方案2】:

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。 尽早转储,经常转储。

【讨论】:

刚刚为我节省了大量时间。谢谢! 刚刚遇到这个问题,发现了这个问题。我还找到了直接解决此问题的paragraph in the PSR-4 规范:“命名空间前缀”之后的连续子命名空间名称对应于“基本目录”中的子目录,其中命名空间分隔符表示目录分隔符。子目录名称必须与子命名空间名称的大小写匹配。 完美!拯救了我的一天。 将文件夹名称从大写更改为小写解决了在 composer dump-autoload 上没有 -o 标志的情况下加载类的问题。你能解释一下原因吗?

以上是关于Laravel psr-4 不自动加载的主要内容,如果未能解决你的问题,请参考以下文章

PSR-4 和类图自动加载的区别?

psr-0 与作曲家自动加载不工作,但它与 psr-4 自动加载完美配合

Laravel 供应商自动加载不起作用

类不符合 psr-4 自动加载标准。跳过[重复]

作曲家更新错误不符合 psr-4 自动加载标准。跳过

如何为我的项目创建 PSR-4 自动加载器?