🦔

composerのオートローディングにおいて、dump-autoloadが必要かどうかをまとめた

2023/06/13に公開

composerのオートローディングの仕様を理解しやすいようにまとめたものです。
composer2系で確認しています。

composer.jsonの記述例
  "autoload": {
    "psr-4": {
      "App\\": "app/",
      "Database\\Factories\\": "database/factories/",
      "Database\\Seeders\\": "database/seeders/"
    },
    "files": [
      "app/Helpers/helpers.php"
    ]
  },
  "autoload-dev": {
    "psr-4": {
      "Tests\\": "tests/"
    }
  },

autoloadに記述できるパラメータ一覧

以下はcomposerのautoloadautoload-devで記述できるパラメータの一覧です。
生成ファイルは対象のパラメータごとに生成されるファイルです。(実際はvendor/composer/autoload_static.php が読まれるのですがこちらは全部がまとまってしまっているのでわかりにくいかも)

簡易確認表

パラメータ名 dump-autoloadが必要か
psr-4 初回以外不要
psr-0 初回以外不要
classmap クラスが新しく増えたら必要
files 初回以外不要

psr-4

生成ファイル : vendor/composer/autoload_psr4.php
dump-autoloadの必要性 : 書いた初回以外は不要

PSR-4のローディングの仕様に合わせる場合のパラメータです。
対象のディレクトリの情報だけがオートローダーに登録されるため、dump-autoloadが基本的には不要になるのが良いです。

// vendor/composer/autoload_psr4.php内の記述例
return array(
    'Illuminate\\' => array($vendorDir . '/laravel/framework/src/Illuminate'),
);

psr-0

生成ファイル : vendor/composer/autoload_namespaces.php
dump-autoloadの必要性 : 書いた初回以外は不要

PSR-0のローディングの仕様に合わせる場合のパラメータです。
対象のディレクトリの情報だけがオートローダーに登録されるため、dump-autoloadが基本的には不要になるのが良いです。
ただ、PSR-4のほうがディレクトリの記述などが少なく済むので現在はほぼ使われてません。

// vendor/composer/autoload_namespaces.php内の記述例
return array(
    'Sentry\\Laravel\\' => array($vendorDir . '/sentry/sentry-laravel/src'),
);

classmap

生成ファイル : vendor/composer/autoload_classmap.php
dump-autoloadの必要性 : クラスが新しく増えたら必要

名前空間が存在していない場合や、PSR-4やPSR-0に準拠してない形でクラスを作る際に利用します。
クラスごとに設定が書かれるので、クラスを新しく用意したら再度dump-autoloadの必要があるので最近はあまりつかわれていません。

// vendor/composer/autoload_classmap.php内の記述例
return array(
    'Clockwork\\Clockwork' => $vendorDir . '/itsgoingd/clockwork/Clockwork/Clockwork.php',
);

files

生成ファイル : vendor/composer/autoload_files.php
dump-autoloadの必要性 : 初回以外不要、ファイルリストを編集したら必要

関数や設定値などをロードしたい場合やグローバルに利用されるクラスの初期設定(あまり使わない)などに利用します。
主に利用するケースはヘルパーくらいです。ヘルパー以外ではほぼ使うことはないです。

// vendor/composer/autoload_files.php内の記述例
return array(
    'ランダム文字列?' => $vendorDir . '/laravel/framework/src/Illuminate/Support/helpers.php',
);

Discussion