次の問題:composer.jsonでクラスマップを定義しました:
"autoload": {
"classmap": [
"app/controllers",
"app/models",
"app/helper.php"
]
}
ただし、「controllers」または「models」フォルダーに新しいファイルを作成すると、それらはロードされず、常にcomposer dump-autoloadを作成する必要があります。
これは正しい動作ですか? composer=のオートローダーは、新しいファイルがないかフォルダーを監視しますか?
はい、これは正しい動作です。新しいクラスを自動的にロードする場合は、PSR-0またはPSR-4オートロードを使用する必要があります。
クラスマップを生成するには、特定のクラスを含むファイル名を知るためにComposerが必要です。これは、ディレクトリ内のソースコード全体を解析し、クラス、インターフェイス、および特性定義をスキャンすることによってのみ実行できます。
これは通常、CPUとI/Oを集中的に使用するタスクであるため、Composerがインストール/更新を行うか、(必要に応じて)オートローダーをダンプする場合にのみ実行され、すべてのrequire "vendor/autoload.php";
。
クラスマップの自動読み込みは、少なくともPSR-0を実装しなかった古いレガシーコードベースに対してのみ存在することに注意してください。開発中に何度もオートローダーをダンプするために代金を払う場合を除き、新しいコード用ではありません。
SSHでサーバーのルートに移動します。次の手順を実行します。
ls
を実行して、すべてのファイルをリストします。composer.lock
ファイルが表示されます。 rm composer.lock
コマンドでファイルを削除します。php composer update
コマンドを実行します。Linuxのタイプによっては、php-cli composer update
を実行する必要があります。
ステップ3は新しいcomposer.lock
ファイルを作成し、すべてのクラスが再度ロードされます。これは、新しいクラスを追加するたびに行います。
または:
composer dump-autoload
コマンドを実行します。すでに指摘したように、これは正しい動作です。新しいクラスを自動的にロードする場合は、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が見つからなかった場合はクラスに渡されます。クラスがプレフィックスに一致すると、オートローダーとクラスマップの更新。