问题描述
我正在尝试自动加载一个没有任何类的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}'