我有一个有多个子文件夹的项目。在其中一个文件夹中,它们是一些"插件"。所有这些插件都有一个 composer.json 和一个供应商文件夹。我现在想构建自己的插件并创建了一个新文件夹并将composer.json
放入该目录中。 composer install
工作没有任何问题,但是当我以某种方式安装我的插件时,我收到错误
FastCGI: server "/fcgi-bin-php5-fpm-ezi" stderr: PHP message: PHP Fatal error: Call to undefined method Composer\Autoload\ClassLoader::setPsr4()
什么可能导致此问题?我已经做了composer dump-autoload
和composer global update
,因为我在互联网上找到了这些解决方案,但它仍然不起作用。我是否必须做一些特别的事情才能让它在子文件夹中工作?
这是目前我的作曲家.json
{
"name": "namespace/projectname-addonname",
"autoload": {
"psr-4": {
"namespace1\namespace2\namespace3\" : "src"
}
}
}
我不知道这是否有帮助,但是当我var_dump
加载程序时,这就是结果
object(ComposerAutoloadClassLoader)#138 (4) {
["prefixes":"ComposerAutoloadClassLoader":private]=>
array(0) {
}
["fallbackDirs":"ComposerAutoloadClassLoader":private]=>
array(0) {
}
["useIncludePath":"ComposerAutoloadClassLoader":private]=>
bool(false)
["classMap":"ComposerAutoloadClassLoader":private]=>
array(0) {
}
}
之后,调用$loader->setPsr4
方法,我收到致命错误。
奇怪的是,当使用 classmap
而不是 psr-4
进行自动加载时,它可以毫无问题地工作。
"autoload":
{
"psr-4":
{
"namespace1\namespace2\namespace3\" : "src"
},
"classmap": ["src/"]
}
试试这个!
就我而言,代码中ClassLoader.php
文件的多个版本存在问题。让我解释一下我的情况,我有多个带有 Composer 的 Wordpress 插件,首先如何初始化它们需要ClassLoader.php
composer/autoload_real.php
文件中的以下代码
if ('ComposerAutoloadClassLoader' === $class) {
require __DIR__ . '/ClassLoader.php';
}
然后,当您再次调用时require __DIR__ . '/autoload.php';
类已经加载并且可能具有不同的接口(在我们的例子中缺少函数(。
您可以使用反射进行检查,并在new ComposerAutoloadClassLoader();
后立即将以下代码添加到composer/autoload_real.php
$reflector = new ReflectionClass('\Composer\Autoload\ClassLoader');
die($reflector->getFileName());
在我的情况下,类是从不同的来源加载的,然后是当前的工作目录。
解决方案:
- 下载最新版本的作曲家与
composer self-update
- 然后访问项目中具有
composer.json
的所有文件夹并调用composer update
- 然后运行
composer global update
并检查是否有帮助