web-dev-qa-db-ja.com

Composerを使用してベンダーの外部からクラスを自動ロードするにはどうすればよいですか?

作曲家からのpsr-4オートローダーを使用します。

"autoload": {
    "psr-4": {
        "DG\\Munchkin\\": "src/DG/Munch/"
    }
}

これは/var/www/html/xxx/vendor/yyy/src/DG/Munchからクラスをロードします

しかし、どのようにして/var/www/html/xxx/からクラスをロードできますか?

独自のオートローダーを作成しましたが、vendor/autoload.php(コンポーザーオートロード)とオートローダーが必要な場合、独自のオートローダーでクラスのインスタンスを作成するまで機能しません。

16
Tomasz Szymanek

srcディレクトリはプロジェクトルートにあります。 vendorディレクトリと同じレベルにあります。

定義する場合

"autoload": {
    "psr-4": {
        "DG\\Munchkin\\": "src/DG/Munch/"
    }
}

あなたが述べたように、これは/var/www/html/xxx/vendor/yyy/src/DG/Munchからクラスをロードしません。

プロジェクト構造は次のとおりです。

/var/www/html/
 +- /xxx (project)
     - composer.json
     +- /src
        +- DG
           +- Munch
     +- /vendor
        - autoload.php
        +- vendor-projectA
        +- vendor-projectB
        +- yyy

\DG\Munchkin名前空間は内部のクラスにマッピングされます

/var/www/html/xxx/src/DG/Munch(内部ではない)

/var/www/html/xxx/vendor/yyy/src/DG/Munch

しかし、どうすれば/ var/www/html/xxx /からクラスをロードできますか?

プロジェクトのcomposer.json(/ var/www/html/xxx /内)でパスを定義します。

"autoload": {
    "psr-4": {
        "ProjectRoot\\" : "", 
        "NamspaceInSourceDir\\" : "src/"         
    }
 }

または、index.phpでcomposerオートローダーをロードするか、bootstrapの間に手動でパスを追加します。

$loader = require 'vendor/autoload.php';
$loader->add('Namespace\\Somewhere\\Else\\', __DIR__);
$loader->add('Namespace\\Somewhere\\Else2\\', '/var/www/html/xxx');

参照: https://getcomposer.org/doc/04-schema.md#autoload

33
Jens A. Koch