Composer 在尝试自动加载 PHP 文件时需要 class(但未找到)

Composer expected class(but not found) when trying to autoload PHP file

我正在尝试自动加载一个 PHP 文件,里面没有任何 class,而是使用辅助函数。像 Laravel 帮手这样的东西:

<?php

if (!function_exists('fixture')) {
    function fixture()
    {
        // some code here
    }
}

根据文档,这很简单,我正在做类似的事情:

"autoload": {
        "files": [
            "src/Helpers/helpers.php"
        ],
        "psr-4": {
            "App\": "src/"
        }
    },

在那之后,我正在做 composer dumpautoload 来重新生成整个东西。然后奇怪的事情发生了。

如果这很重要,我正在使用 Symfony 5。只要我将帮助文件保存在 src 目录中,我就会收到此错误:

Fatal error: Uncaught Symfony\Component\DependencyInjection\Exception\InvalidArgumentException: Expected to find class "App\Helpers\helpers" in file "/srv/app/src/Helpers/helpers.php" while importing services from resource "../src/*", but it was not found! Check the namespace prefix used with the resource. in /srv/app/vendor/symfony/dependency-injection/Loader/FileLoader.php:206

当我将它移出 src 目录时,它似乎工作正常。在我看来,作曲家认为 psr-4 比文件密钥更重要。

有趣的是 Laravel 做了同样的事情,而且显然工作得很好。示例:

"autoload": {
        "files": [
            "src/Illuminate/Foundation/helpers.php",
            "src/Illuminate/Support/helpers.php"
        ],
        "psr-4": {
            "Illuminate\": "src/Illuminate/"
        }
    },

有谁知道为什么会发生这种情况?我确定这很傻,我只是看不出它是什么...

您的 Composer 设置看起来不错,只是带有服务管理器 (di-container) 的 Symfony 自动加载器首先加载。

您是从命名空间内调用函数,函数本身没有命名空间。

尝试使用 \fixture(); 而不是 fixture(); 来显式使用根命名空间。

我不确定是否有解决方法,我只是假设 Symfony 没有设置 di-container 来处理函数而不是 class。

一个好的方法是正确连接 class 并且不要在项目工作流程之外使用它。

考虑到测试,有简单的配置方法,setUp() and load from data providers

要为所有测试加载一些东西,请使用 --bootstrap 标志:

phpunit --bootstrap test/bootstrap.php

然后bootstrap.php:

<?php

require_once 'vendor/autoload.php';

function fixture() {
    // ...
}

在config/services.yaml

 App\:
    resource: '../src/'
    exclude:
        - '../src/helpers.php'

App\:
    resource: '../src/*'
    exclude: '../src/{helpers.php}'