7

我有一个有多个子文件夹的项目。在其中一个文件夹中,它们是一些“插件”。所有这些插件都有一个 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-autoloadcomposer global update因为我在互联网上找到了这些解决方案,但它仍然不起作用。我是否必须做一些特别的事情才能使其在子文件夹中工作?

这是目前我的 composer.json

{
  "name": "namespace/projectname-addonname",
  "autoload": {
    "psr-4": {
      "namespace1\\namespace2\\namespace3\\" : "src"
    }
  }
}

我不知道这是否有帮助,但是当我var_dump加载程序时,这就是结果

object(Composer\Autoload\ClassLoader)#138 (4) {
  ["prefixes":"Composer\Autoload\ClassLoader":private]=>
  array(0) {
  }
  ["fallbackDirs":"Composer\Autoload\ClassLoader":private]=>
  array(0) {
  }
  ["useIncludePath":"Composer\Autoload\ClassLoader":private]=>
  bool(false)
  ["classMap":"Composer\Autoload\ClassLoader":private]=>
  array(0) {
  }
}

之后$loader->setPsr4调用该方法,我得到了致命错误。

奇怪的是,当使用classmap而不是psr-4自动加载时,它可以正常工作。

4

2 回答 2

2

ClassLoader.php就我而言,代码中文件的多个版本存在问题。让我解释一下我的情况,我有多个带有 Composer 的 Wordpress 插件,以及它们是如何初始化的,首先需要在文件ClassLoader.php中使用以下代码composer/autoload_real.php

if ('Composer\Autoload\ClassLoader' === $class) {
  require __DIR__ . '/ClassLoader.php';
}

然后当你再次调用时,require __DIR__ . '/autoload.php';类已经加载并且可能有不同的接口(在我们的例子中缺少函数)。

您可以使用反射检查它,composer/autoload_real.php在后面添加以下代码new \Composer\Autoload\ClassLoader();

$reflector = new ReflectionClass('\\Composer\\Autoload\\ClassLoader');
die($reflector->getFileName());

在我的情况下,类是从不同的源加载的,然后是当前的工作目录。

解决方案

  • 下载最新版本的作曲家composer self-update
  • 然后访问您项目中的所有文件夹composer.json并调用composer update
  • 然后运行composer global update并检查是否有帮助
于 2016-02-09T13:19:09.343 回答
2
"autoload":
 {
    "psr-4":
    {
    "namespace1\\namespace2\\namespace3\\" : "src"
    },

    "classmap": ["src/"]
}

尝试这个!

于 2015-11-07T10:05:24.693 回答