【问题标题】:Composer: How to recursively autoload subfolders in /srcComposer:如何递归地自动加载 /src 中的子文件夹
【发布时间】:2015-12-30 02:58:56
【问题描述】:

我正在为 composer 包编写一些测试,但我无法在 /src 的子文件夹中加载类。

我的文件夹结构

root
 - src
   - file1.php
   - folder1
     - folder2
       - file2.php
 - tests

测试的文件夹结构反映了 src 之一。

在我的 composer.json 我有:

{
    "autoload": {
        "psr-4": {
            "Namespace1\\\Package_Namespace\\\": "src"
        }
    }
}

现在,当我启动测试时,只有 src 中的测试可以很好地包含自己的类,而使用子文件夹中的类的测试则不能(例如,永远不会加载 file2.php)。

我也尝试在 composer.json 文件中显式指定子文件夹,但它似乎不起作用。

我希望有人可以帮助我。如果您需要更多信息,请告诉我,我会提供。

谢谢你,祝你圣诞快乐!

【问题讨论】:

    标签: php composer-php autoload


    【解决方案1】:

    我认为您可能需要在配置中转义命名空间:

    "autoload": { "psr-4": { "Namespace1\\Package_Namespace\\": "src" } }

    并确保您的类/文件名遵循PSR-4。另外,请确保 PHPUnit / 您正在运行的任何测试套件加载了 composer 自动加载文件。

    预计到达时间:

    您还可以手动将您的测试添加到 bootstrap.php 文件中的命名空间(如果您正在使用一个进行测试):

    $loader = require __DIR__ . "/../vendor/autoload.php";
    $loader->addPsr4('Namespace1\\Package_Namespace\\', __DIR__.'/testdir');
    

    显然,您需要根据自己的路径调整上述内容。

    【讨论】:

    • 您好 AlpineCoder,感谢您的回复。当有人提交他的评论时,由于 Stackoverflow 的转义,代码表示错误。我已经修复了添加另一个反斜杠。在代码中,命名空间按照您的建议进行了转义。我认为这更多与包容过程有关。在互联网上阅读,似乎可以更好地指定 Composer 如何导入文件以及如何读取文件夹,但我无法找到一个好的解决方案。
    • 更多,测试都加载正确。只有对应的测试类没有,所以测试说找不到被测试的类。这就是为什么我认为这与包含过程有关。还用 var_dump(get_included_classes()) 转储包含的文件,我需要的类不是 lised(即 file2.php 中的那个)。
    • 您的测试引导程序中是否需要您的作曲家 (`vendor/autoload.php') 文件(参见上面示例的第 1 行)?
    【解决方案2】:

    我认为 Composer 加载 psr-4 地图的方式有问题。

    事实上,我已经更改了反映文件夹结构的命名空间,现在一切正常。

    我认为命名空间可以与文件夹结构不同,但这不起作用。

    我无法更好地解释我的解决方案,但只有反映文件夹结构才有效。是偶然吗?啊!

    无论如何,它现在可以工作了......

    【讨论】:

    • 它只是 { "psr-4": { "src\\": "app/src" } } 现在该文件夹中的每个文件都应该有一个以 src/ 开头的命名空间,例如namespace src\folder1\folder2,当调用文件时它将是use src\folder1\folder2\file2
    • 是的,但我不想要以“src”开头的命名空间。我想要一个以我的自定义名称开头的命名空间...
    • 您可以为您的类添加一个或多个与您的文件所在的基本目录(即src)相对应的命名空间,但您的文件/目录结构必须与您的命名空间结构匹配通过 PSR-4 加载(参见 PSR4 Sec3 p1-2)。
    • 您好 AlpineCoder,感谢您的评论:这是我的解决方案!文件夹结构错误!我正在寻找对此的确认(我想是的),而你给了我。将此解决方案发布为答案,我将选择它作为最佳答案!谢谢!
    猜你喜欢
    • 2014-11-28
    • 2019-10-20
    • 2021-03-04
    • 2018-10-16
    • 2014-10-26
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多