70

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

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

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

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

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

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

4

6 に答える 6

74

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

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

<?php

$loader = require 'vendor/autoload.php';
$loader->add('AppName', __DIR__.'/../src/');
于 2012-10-10T12:13:43.950 に答える
54

作曲家のドキュメントには次のように記載されています。

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

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

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

次の設定は絶対に正しいです:

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

ただし、依存関係を再更新/インストールして、機能させる必要があります。つまり、次のコマンドを実行します。

php composer.phar update

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

composer dump-autoloadまた、@ Domで指摘されているように、更新を行わなくてもオートローダーを更新するために使用できます。

于 2013-03-12T09:18:36.007 に答える
26

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

それ以外の場合は、classmap 参照を使用することをお勧めします。

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

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

注:テスト中に composerdump-autoloadコマンドを起動することを忘れないでください。そうしないと、変更が表示されません。

./composer.phar dump-autoload

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

于 2014-09-21T14:15:06.243 に答える
12

私の意見では、Sergiy の回答は、特定の質問に対して選択された回答である必要があります。私の理解を共有しています。

以下に示す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 update 後、クラスが正常にロードされました。私が観察したのは、作曲家が 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 にあります

于 2015-06-16T10:25:56.533 に答える
3

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

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

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

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

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

于 2012-10-10T12:12:45.310 に答える
3

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

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

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

于 2012-10-10T12:15:55.373 に答える