LLaravel Bootcamp

Day 2ディレクトリ構造、artisan、マイグレーションの思想

Composerと依存管理、autoload

Composerが何をするツールか、composer.jsonとcomposer.lockの違い、autoloadの意味を理解する。

Composerは「部品の調達係」

は、PHPの「依存管理ツール」です。アプリは、認証やPDF生成など、他の人が作った便利なライブラリ(部品)を組み合わせて作ります。それらの部品を、必要なバージョンで自動的にダウンロードして揃えてくれるのがComposerです。Laravel本体もComposerで導入されます。

「依存(dependency)」とは、自分のアプリが動くために必要としている外部の部品のことです。これらを手作業でダウンロードして配置するのは大変で、バージョンの食い違いも起きます。Composerはこの調達とバージョン管理を肩代わりします。

composer.json は「欲しい物リスト」

どの部品をどのバージョン範囲で使いたいかは、composer.json というファイルに書きます。これは「欲しい物リスト」にあたります。人が読み書きする、意図を書くファイルです。

JSON
{
  "require": {
    "php": "^8.2",
    "laravel/framework": "^11.0",
    "guzzlehttp/guzzle": "^7.8"
  }
}
composer.json。^11.0 は「11系の互換範囲でよい」という、幅を持ったバージョン指定。

composer.lock は「実際に入れた物の記録」

一方 composer.lock には、実際にインストールされた「正確なバージョン」が記録されます。composer.json が「11系ならよい」という幅を持つのに対し、lockは「今回入れたのは 11.9.2 だった」という一点を固定します。

なぜ lock ファイルが重要なのか

lockファイルが重要なのは「全員の環境を完全に一致させるため」です。composer.jsonの幅指定だけでインストールすると、時期によって少しずつ違うバージョンが入り、「自分の環境では動くのに他の人の環境では動かない」という事故が起きます。lockを共有すれば、チーム全員と本番環境がまったく同じバージョンを使うことを保証でき、再現性が確保されます。

悪い例: lockを無視して各自install

composer.lockをGit管理から外し、各自が composer update してしまう。結果、開発者ごとに微妙に違うバージョンが入り、本番で予期せぬ不具合が出る。

良い例: lockを共有しinstall

composer.lockをGitで共有し、各自は composer install する。全員が寸分違わぬ同じバージョンで動き、環境差による不具合を防げる。

autoload: クラスを自動で読み込む仕組み

オートロード(autoload)とは、必要なクラスファイルを、使う瞬間に自動で読み込んでくれる仕組みです。Composerは、クラス名(名前空間)とファイルの場所の対応を管理し、いちいち手作業で require しなくてもクラスが使えるようにします。だから Day2 Lesson2 で見た namespace の規約が重要になるのです。

オートロードがない世界

PHP
// 使うクラスの数だけ手でrequireが必要
require "app/Models/User.php";
require "app/Models/Post.php";
require "app/Http/Controllers/UserController.php";
$user = new User();

Composerのオートロード

PHP
// requireは不要。名前空間から自動で解決される
use App\Models\User;

$user = new User();

面接ではこう言う

「Composerは依存管理ツールで、必要なライブラリを指定バージョンで揃えます。composer.jsonが欲しいバージョンの範囲を書く意図のファイル、composer.lockが実際に入れた正確なバージョンを固定する記録で、lockを共有することでチームと本番の環境を完全に一致させ再現性を担保します。加えてオートロードにより、requireを書かずに名前空間からクラスを解決できます」と、lockの再現性まで語れると実務理解が伝わります。

読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。

理解度チェック

答えられれば、面接で説明できる状態に一歩近づきます。

Q1

composer.json と composer.lock の違いとして正しいものはどれか。

Q2

チーム開発で composer.lock を共有し、各自が composer install する理由として最も適切なのはどれか。

Q3

Composerのオートロード(autoload)とは何か、それがあると何が嬉しいのかを説明してください。

記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。