composerのオートロード、requireを書かなくてよくなる仕組み
Composerのオートロードとは、PSR-4で名前空間とディレクトリの対応を宣言しておき、クラスを呼んだ瞬間に対応するファイルを自動で読み込む仕組みです。個別の require が要らなくなります。
PSR-4は名前空間とディレクトリの対応表
クラスごとに require を書くのはもう過去の話で、いまは composer.json の autoload 設定にお任せするのが普通ですね。PSR-4 は「この名前空間はこのディレクトリに対応する」というルールを宣言するだけの仕組みです。あとはクラスを呼んだ瞬間に、対応するファイルを自動で読み込んでくれます。
// composer.json
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
// これで App\Service\Foo は src/Service/Foo.php に対応する
設定を変えたらdump-autoloadを忘れずに
ハマりやすいのが、autoload の設定を追記したのに反映されない、というやつです。マッピングは vendor/autoload.php の裏でキャッシュ的に生成されているので、composer.json をいじったら composer dump-autoload を走らせて作り直す必要があります。「クラスが見つからない」と言われたら、まずこれを疑うといいですね。
# 設定を変えたら再生成
composer dump-autoload
# 本番向けにマップを最適化するなら
composer dump-autoload -o
PSR-4 に沿っていれば新しいクラスを足すだけなら dump-autoload は不要なことも多いのですが、名前空間の対応自体を変えたときは必須です。迷ったら走らせておいて損はないと思います。
classmapとfilesの使いどころ
PSR-4 に乗らないコードもたまにあります。命名がバラバラなレガシーは classmap でディレクトリごとスキャンさせ、クラスに属さないヘルパ関数群は files で無条件に読み込む、という逃げ道が用意されています。関数を早い段階でグローバルに置きたいときは files が便利ですね。
"autoload": {
"psr-4": { "App\\": "src/" },
"classmap": ["legacy/"],
"files": ["src/helpers.php"]
}
まとめ
基本は PSR-4 で名前空間とディレクトリをきれいに対応させておけば、require からはほぼ解放されます。うまく読み込まれないときは、名前空間とパスのズレか、dump-autoload のかけ忘れのどちらかがほとんどですね。関数やレガシーには files / classmap という逃げ道もある、と知っておくと詰まりにくい気がします。
よくある質問
Q. autoload の設定を変えたのに反映されません。
A. マッピングは生成されたファイルにキャッシュされるので、composer.json をいじったら composer dump-autoload を走らせて作り直す必要があります。
Q. PSR-4 に乗らないコードはどうしますか?
A. 命名がバラバラなレガシーは classmap でディレクトリごとスキャンさせ、クラスに属さないヘルパ関数は files で無条件に読み込む、という逃げ道があります。