【问题标题】:composer dump-autoload -o skips all my classescomposer dump-autoload -o 跳过我所有的课程
【发布时间】:2021-03-27 15:22:42
【问题描述】:

我刚刚升级到 Composer 2.0,它显然对解析类的方式做了一些修改...

composer dump-autoload -o 或别名 composer du -o 基本上会在我的控制台中转储很多行,其中包含如下文本:

类 MyProject\SubCategory\CoolClass 位于 C:/udvikling/MyProjectRoot/src/MyProjectClasses\MyProject\SubCategory\CoolClass.php 不符合 psr-4 自动加载标准。跳过

阅读Composer psr-4 autoload issue 后,我确保所有有助于我的命名空间和类路径的名称都是大写的。即use myproject/helperclass 现在是use MyProject/HelperClass

我的 C:/udvikling/MyProjectRoot/src/composer.json 包括以下内容

    "autoload": {
        "psr-4": {
            "MyProject\\": "MyProjectClasses/"
        }
    }

我通过在类名中添加一个前导反斜杠来解决这个问题:

<?php

namespace \MyProject\Core;

class Timer {
    //...

但是...根据php.net

名称空间声明中不允许使用完全限定名称(即以反斜杠开头的名称),因为此类结构被解释为相对名称空间表达式。

所以这似乎不是正确的选择...(我的 IDE 在它下面还给了我一条愤怒的波浪线...)

除了回到另一个版本的作曲家之外,我该如何解决这个问题?

文件结构:

C:\udvikling\MyProjectRoot -- the root of the project
C:\udvikling\MyProjectRoot\src --the php sources
C:\udvikling\MyProjectRoot\src\MyProjectClasses -- my PHP classes
C:\udvikling\MyProjectRoot\src\vendor -- my vendor stuff for composer
C:\udvikling\MyProjectRoot\src\composer.json - my composer config

【问题讨论】:

  • 你能告诉我们你的文件结构吗?
  • 我不确定你的文件结构是什么。格式看起来有点糟糕。是C:/udvikling/MyProjectRoot/src/MyProjectClasses 还是有实际的下划线?还有你的composer.json 文件在这个结构中的什么位置?
  • @apokryfos 我希望这能让它更清楚

标签: php namespaces composer-php


【解决方案1】:

我去了extrareading

显然 psr-4 的目标之一是减少文件夹深度。

“src”和“tests”目录必须包含供应商和包目录名称。 >这是 PSR-0 合规性的产物。

许多人发现这种结构比必要的更深、更重复。该提案表明附加或替代 PSR 将是有用的 [...]

很难通过对 PSR-0 的扩展或修改来实现面向包的自动加载,因为 PSR-0 不允许类名的任何部分之间存在中间路径。

所以基本上,问题是在我的MyProjectClasses 目录中,对于MyProject\Core\Timer 类,我有一个类似的目录结构: C:\udvikling\MyProjectRoot\src\MyProjectClasses\MyProject\Core\Timer.php.
这必须更改为不包含基本包:C:\udvikling\MyProjectRoot\src\MyProjectClasses\Core\Timer.php

【讨论】:

    猜你喜欢
    • 2013-12-14
    • 2018-06-06
    • 2015-06-06
    • 1970-01-01
    • 2014-06-12
    • 2018-09-09
    • 2016-01-23
    • 2020-07-13
    • 2018-07-17
    相关资源
    最近更新 更多