尝试自动加载PHP文件时,Composer预期的类但未找到

问题描述

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

<?PHP

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

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

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

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

如果那很重要,我正在使用Symfony5。只要将我的助手文件保存在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/"
        }
    },

有人知道为什么会这样吗?我敢肯定这很愚蠢,我只是看不到它是什么...

解决方法

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

您正在命名空间中调用该函数,该函数本身未命名空间。

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

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

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

考虑到测试,有简单的方法来配置setUp()和从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}'

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...