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}'
我正在尝试自动加载一个 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}'