7

複数のサブフォルダーを持つプロジェクトがあります。フォルダの 1 つで、それらはいくつかの「アドオン」です。これらのアドオンにはすべて composer.json と vendor-folder があります。独自のアドオンを作成し、新しいフォルダーを作成して、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ましたが、それでも機能しません。サブフォルダーで機能させるために何か特別なことをする必要がありますか?

これは現在、私の 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';クラスは既にロードされており、異なるインターフェイスを持つ可能性があります (この場合は関数がありません)。

Reflectionで確認できます。composer/autoload_real.php直後にフォローコードを追加してくださいnew \Composer\Autoload\ClassLoader();

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

私の場合、現在の作業ディレクトリとは異なるソースからロードされたクラスでした。

解決策:

  • でcomposerの最新バージョンをダウンロードする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 に答える