web-dev-qa-db-ja.com

Composer classmap autoloadはフォルダ内の新しいファイルをロードしません

次の問題:composer.jsonでクラスマップを定義しました:

"autoload": {
    "classmap": [
        "app/controllers",
        "app/models",
        "app/helper.php"
    ]   
}

ただし、「controllers」または「models」フォルダーに新しいファイルを作成すると、それらはロードされず、常にcomposer dump-autoloadを作成する必要があります。

これは正しい動作ですか? composer=のオートローダーは、新しいファイルがないかフォルダーを監視しますか?

20
pyxl

はい、これは正しい動作です。新しいクラスを自動的にロードする場合は、PSR-0またはPSR-4オートロードを使用する必要があります。

クラスマップを生成するには、特定のクラスを含むファイル名を知るためにComposerが必要です。これは、ディレクトリ内のソースコード全体を解析し、クラス、インターフェイス、および特性定義をスキャンすることによってのみ実行できます。

これは通常、CPUとI/Oを集中的に使用するタスクであるため、Composerがインストール/更新を行うか、(必要に応じて)オートローダーをダンプする場合にのみ実行され、すべてのrequire "vendor/autoload.php";

クラスマップの自動読み込みは、少なくともPSR-0を実装しなかった古いレガシーコードベースに対してのみ存在することに注意してください。開発中に何度もオートローダーをダンプするために代金を払う場合を除き、新しいコード用ではありません。

23
Sven

SSHでサーバーのルートに移動します。次の手順を実行します。

  1. lsを実行して、すべてのファイルをリストします。
  2. composer.lockファイルが表示されます。 rm composer.lockコマンドでファイルを削除します。
  3. php composer updateコマンドを実行します。

Linuxのタイプによっては、php-cli composer updateを実行する必要があります。

ステップ3は新しいcomposer.lockファイルを作成し、すべてのクラスが再度ロードされます。これは、新しいクラスを追加するたびに行います。

または:

  1. composer dump-autoloadコマンドを実行します。
9

すでに指摘したように、これは正しい動作です。新しいクラスを自動的にロードする場合は、PSR-0またはPSR-4オートロードを使用する必要があります。

指定されたクラスマップのオートロードタイプはcomposer.jsonです。主に、PSR-0またはPSR-4に従わないレガシープロジェクトで使用されます。私は最近そのようなプロジェクトに取り組み始め、自動的にcomposer dump-autoloadコマンドは、新しいクラスが作成されたとき。これは、プロジェクト内にcomposerソースのすべてを含めることなく、実際には注意が必要です。

$loader = include_once 'vendor/autoload.php';
if ( ! $loader ) {
    throw new Exception( 'vendor/autoload.php missing please run `composer install`' );
}

spl_autoload_register(
    function ( $class ) {
        if ( 'A_Common_Class_Prefix' === substr( $class, 0, 10 ) ) {
            throw new Error( 'Class "' . $class . '"" not found please run `composer dump-autoload`' );
        }
    },
    true
);

これにより、コンポーザーのオートローダーの後に実行される別のオートローダーが登録されるため、クラスcomposerが見つからなかった場合はクラスに渡されます。クラスがプレフィックスに一致すると、オートローダーとクラスマップの更新。

0
David Stone