web-dev-qa-db-ja.com

Composerのオートロードを使用する

私はこの問題で運のないネットを見回してきました。 composer.jsonのこのコードで作曲家のオートロードを使用しています:

"autoload": {
    "psr-0": {"AppName": "src/"}
}

しかし、ベンダーフォルダーよりも高いレベルで自動ロードする必要があります。

このようなことをしてもうまくいきません:

"autoload": {
    "psr-0": {"AppName": "../src/"}
}

誰かが修正を知っていますか、これをどのように行うことができますか?

65
Chris R

すべてのパッケージは、それ自体のオートロードを担当する必要があります。定義したパッケージ外のオートロードクラスで何を達成しようとしていますか?

アプリケーション自体の場合の回避策の1つは、ローダーインスタンスに次のような名前空間を追加することです。

<?php

$loader = require 'vendor/autoload.php';
$loader->add('AppName', __DIR__.'/../src/');
69
Seldaek

composer documentation は次のように述べています:

Autoloadフィールドを追加した後、インストールを再実行して、vendor/autoload.phpファイルを再生成する必要があります。

「src」ディレクトリが「vendor」ディレクトリと同じレベルにあると仮定します。

  • src
    • AppName
  • ベンダー
  • composer.json

次の設定は完全に正しいです:

{
    "autoload": {
        "psr-0": {"AppName": "src/"}
    }
}

ただし、動作させるために依存関係を再更新/インストールする必要があります。つまり、次を実行します。

php composer.phar update

このコマンドは、依存関係の最新バージョンを取得し、構成に一致するように「vendor/composer/autoload_namespaces.php」ファイルを更新します。

また、@ Domで述べたように、composer dump-autoloadを使用して、更新を行わなくてもオートローダーを更新できます。

55

composer autoload機能を使用する他の方法もあります。名前空間のないパッケージまたはカスタムの自動ロード機能を備えたパッケージをロードするのに役立つ方法。

たとえば、オートロード機能を含む単一のファイルを含める場合は、次のように「files」ディレクティブを使用できます。

"autoload": {
    "psr-0": {
        "": "src/",
        "SymfonyStandard": "app/"
    },
    "files": ["vendor/wordnik/wordnik-php/wordnik/Swagger.php"]
},

そして、Swagger.phpファイル内で次のようになりました:

function swagger_autoloader($className) {
    $currentDir = dirname(__FILE__);
    if (file_exists($currentDir . '/' . $className . '.php')) {
        include $currentDir . '/' . $className . '.php';
    } elseif (file_exists($currentDir . '/models/' . $className . '.php')) {
        include $currentDir . '/models/' . $className . '.php';
    }
}
spl_autoload_register('swagger_autoloader');

https://getcomposer.org/doc/04-schema.md#files

それ以外の場合は、クラスマップリファレンスを使用できます。

{
    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }
}

https://getcomposer.org/doc/04-schema.md#classmap

注:テスト中にcomposer dump-autoloadコマンドを忘れずに起動することを忘れないでください。

./composer.phar dump-autoload

ハッピーオートローディング=)

22

私の意見では、 Sergiy's answerは、与えられた質問に対して選択された答えでなければなりません。私は私の理解を共有しています。

以下に示すdir構造の下にあるcomposerを使用して、パッケージファイルを自動ロードしようとしていました。

<web-root>
    |--------src/
    |           |--------App/
    |           |
    |           |--------Test/
    |
    |---------library/
    |
    |---------vendor/
    |           |
    |           |---------composer/
    |           |           |---------autoload_psr4.php
    |           |           
    |           |----------autoload.php
    |
    |-----------composer.json
    |

psr-4 オートローディング仕様を使用しています。

プロジェクトのcomposer.jsonに以下の行を追加する必要がありました。クラスファイルをsrc/App、src/Testおよびライブラリディレクトリに配置する予定です。

"autoload": {
        "psr-4": {
            "OrgName\\AppType\\AppName\\": ["src/App", "src/Test", "library/"]
        }
    } 

これはほとんど自明です。 OrgName\AppType\AppNameは、意図した名前空間プレフィックスです。例えばsrc/App/Controller/Provider/User.phpのクラスUserの場合-

namespace OrgName\AppType\AppName\Controller\Provider; // namespace declaration

use OrgName\AppType\AppName\Controller\Provider\User; // when using the class

また、「src/App」、「src/Test」は、composer.jsonが存在するWebルートからのものであることに注意してください。ベンダーのディレクトリとは関係ありません。 vendor/autoload.phpを見てください

composerが正しくインストールされている場合、必要なのは#composer update

composerの更新後、クラスが正常にロードされました。私が観察したのは、composerがvendor/composer/autoload_psr4.phpに行を追加していることです

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
    'OrgName\\AppType\\AppName\\' => array($baseDir . '/src/App', $baseDir . '/src/Test', $baseDir . '/library'),
);

これがcomposerのマッピング方法です。 psr-0マッピングの場合、vendor/composer/autoload_classmap.phpにあります。

12
nayak

クラスを含むフォルダを指す名前空間のsrcフォルダにシンボリックリンクを作成するだけです...

ln -s ../src/AppName ./src/AppName

composerのオートロードは同じように見えます...

"autoload": {
    "psr-0": {"AppName": "src/"}
}

AppName名前空間クラスは、現在の作業ディレクトリからsrcフォルダ内のディレクトリを開始します...これで動作するはずです。

3
JamesHalsall

Autoload configは、ベンダーディレクトリの下で開始します。したがって、ベンダーのディレクトリを変更したい場合があります。

{
    "config": {
        "vendor-dir": "../vendor/"
    },
    "autoload": {
        "psr-0": {"AppName": "src/"}
    }
}

または、これはあなたのプロジェクトでは不可能ですか?

3
acme