Q. MVCとは何ですか?
回答のポイント
アプリを Model(データ)・View(画面)・Controller(仲介)の3つの役割に分ける設計。責務を分離して保守性を上げる考え方。
自分の言葉での一言
「Modelがデータ、Viewが表示、Controllerがその仲介で、役割を分けて保守しやすくする設計だと理解しています。」
Laravel 実務Q&A 一覧表
実務でよく問われる Laravel の質問を、「質問」「回答のポイント」「自分の言葉での一言」の3列で 29 項目、一覧表にまとめました。 じっくり深掘りしたいときは想定Q&A集へ。ここは要点をサッと見返す復習シートとして使ってください。
📝 この表の見方
MVC・ルーティング・Blade など、まず押さえる土台
回答のポイント
アプリを Model(データ)・View(画面)・Controller(仲介)の3つの役割に分ける設計。責務を分離して保守性を上げる考え方。
自分の言葉での一言
「Modelがデータ、Viewが表示、Controllerがその仲介で、役割を分けて保守しやすくする設計だと理解しています。」
回答のポイント
「どのURLに来たら、どの処理を呼ぶか」の対応づけ。routes/web.php や routes/api.php に定義する。
自分の言葉での一言
「URLとコントローラの処理を結びつける入口で、web.php や api.php に書きます。」
回答のポイント
リクエストを受け取り、必要な処理へ振り分け、レスポンスを返す交通整理役。業務ロジックは書きすぎず薄く保つ。
自分の言葉での一言
「処理の振り分け役に徹して、ロジックはサービス層に切り出し薄く保つよう意識しています。」
回答のポイント
Laravel標準のテンプレートエンジン。{{ }} での出力や @if / @foreach、レイアウト継承・コンポーネントが使える。
自分の言葉での一言
「HTMLにデータを埋め込むテンプレートで、継承やコンポーネントで画面を再利用できます。」
回答のポイント
テーブルの作成・変更を PHP コードで記録・実行する仕組み。バージョン管理でき、チームで同じDB構造を再現できる。
自分の言葉での一言
「DB構造の変更履歴をコードで管理する仕組みで、誰でも同じテーブルを再現できます。」
回答のポイント
Laravel付属のCLIツール。make:controller などの雛形生成、migrate、tinker、キュー実行などを行う。
自分の言葉での一言
「php artisan で雛形生成やマイグレーションなど定型作業を素早く行えるコマンド群です。」
回答のポイント
ルートのパラメータから自動でモデルを解決して注入する仕組み。show(User $user) のように受け取れる。
自分の言葉での一言
「URLのIDから対応するモデルを自動で取ってきて渡してくれる仕組みで、find を書かずに済みます。」
ORM・リレーション・N+1 など、データ操作まわり
回答のポイント
テーブルをモデルクラスとして扱う仕組み。SQLをほぼ書かずに User::find(1) のような直感的な操作ができる。
自分の言葉での一言
「テーブルをモデルとして操作できるORMで、SQLを書かずに直感的にデータを扱えます。」
回答のポイント
hasOne / hasMany / belongsTo / belongsToMany など。モデルにメソッドとして定義し、関連データをたどれる。
自分の言葉での一言
「1対多なら hasMany と belongsTo、多対多は belongsToMany で表現し、関連データを簡単にたどれます。」
回答のポイント
一覧取得後に関連を1件ずつ取り、クエリが大量発行される問題。with() の Eager Loading でまとめて取得して解決する。
自分の言葉での一言
「ループ内で関連を都度取ってクエリが増える問題で、with()のEager Loadingで一括取得して防ぎます。」
回答のポイント
Eagerは with() で関連を先読み。Lazyはアクセス時に都度取得。一覧+関連表示では Eager が基本。
自分の言葉での一言
「先にまとめて読むのがEager、必要時に都度読むのがLazyで、一覧表示ではEagerを選びます。」
回答のポイント
Eloquentはモデル単位でオブジェクトを返し可読性が高い。クエリビルダは DB::table() でSQL寄り・軽量。大量集計等で使い分ける。
自分の言葉での一言
「可読性重視ならEloquent、大量データや複雑な集計では軽いクエリビルダ、と用途で使い分けます。」
回答のポイント
マイグレーションは「テーブルの構造」を作る。シーダーは「中身のデータ(初期・テスト用)」を入れる。役割が別。
自分の言葉での一言
「構造を作るのがマイグレーション、初期データを入れるのがシーダーと役割が分かれています。」
回答のポイント
リクエスト値を一括代入する機能。意図しない列の書き換えを防ぐため $fillable / $guarded で許可列を制限する。
自分の言葉での一言
「一括代入で余計な列を書き換えられないよう、$fillableで許可する列を明示します。」
回答のポイント
物理削除せず deleted_at に日時を入れて論理削除する仕組み。SoftDeletes トレイトで有効化。復元も可能。
自分の言葉での一言
「実際には消さず deleted_at で削除扱いにする仕組みで、あとから復元もできます。」
サービスコンテナ・DI・ライフサイクルなど、仕組みの理解
回答のポイント
クラスの依存を自動で解決・生成して渡してくれる箱。LaravelのDIの中核で、bind/singleton で登録する。
自分の言葉での一言
「必要な部品(依存)を自動で組み立てて渡してくれる仕組みで、LaravelのDIの中核です。」
回答のポイント
依存オブジェクトを自分でnewせず外から受け取る設計。疎結合になり、テスト時にモックへ差し替えやすい。
自分の言葉での一言
「依存を外から渡す設計で、結合を弱くしてテストや差し替えをしやすくします。」
回答のポイント
Route:: や Cache:: のように、静的呼び出しの見た目でコンテナ内の実体へアクセスする窓口。実体は解決可能でテストしやすい。
自分の言葉での一言
「コンテナ内のクラスへ静的メソッド風にアクセスできる入口で、短く書けてテストも可能です。」
回答のポイント
アプリ起動時にコンテナへの登録(register)や初期化(boot)を行う場所。各機能はここで組み立てられる。
自分の言葉での一言
「起動時に何をコンテナへ登録するかをまとめる場所で、register と boot の2段階で設定します。」
回答のポイント
リクエストがコントローラに届く前後に挟む処理。認証チェック・CSRF・ログなど横断的な関心事をまとめて扱う。
自分の言葉での一言
「処理の前後に挟む関所で、ログイン確認やCSRFなど共通処理をまとめて行います。」
回答のポイント
public/index.php → カーネル起動 → ミドルウェア → ルーティング → コントローラ → レスポンス、の流れ。
自分の言葉での一言
「index.phpが入口で、カーネルとミドルウェアを通りルーティングからコントローラへ渡り、レスポンスを返します。」
回答のポイント
registerはバインド登録だけを行う(他サービス未確定)。bootは全登録後に呼ばれ、実際の初期化処理を書く。
自分の言葉での一言
「registerで登録だけ行い、全部揃った後のbootで初期化する、と順序を分けて理解しています。」
バリデーション・認証・テストなど、現場で使う知識
回答のポイント
$request->validate() か FormRequest クラスに rules() を定義。ルールが複雑ならFormRequestで分離するのが定石。
自分の言葉での一言
「軽ければvalidate()、複雑ならFormRequestにrules()を切り出してコントローラを薄く保ちます。」
回答のポイント
Breeze / Fortify / Sanctum などのスターターを利用。auth ミドルウェアでルート保護、Auth::user() で取得。
自分の言葉での一言
「BreezeやSanctumを使い、authミドルウェアでルートを保護し、Auth::user()でログイン中のユーザーを扱います。」
回答のポイント
Laravelはトークンで自動対策。Bladeの @csrf でフォームにトークンを埋め込み、ミドルウェアが検証する。
自分の言葉での一言
「フォームに@csrfでトークンを入れ、ミドルウェアが照合するのでCSRFを自動で防げます。」
回答のポイント
DB接続・APIキーなど環境ごとに変わる値・秘密情報を置く。コードに直書きせず config 経由で参照。Gitには含めない。
自分の言葉での一言
「接続情報や秘密の値を環境ごとに.envに分け、config経由で読むことでコードに直書きしません。」
回答のポイント
キャッシュは重い処理・結果を一時保存して高速化。キューはメール送信等の重い処理を非同期で後回しにする。
自分の言葉での一言
「重い結果はキャッシュで速く、時間のかかる処理はキューで非同期にしてレスポンスを軽くします。」
回答のポイント
Feature/Unit に分け、artisan test で実行。RefreshDatabase でDBを毎回初期化し、$this->get() 等で振る舞いを検証。
自分の言葉での一言
「FeatureとUnitに分け、RefreshDatabaseで初期化しつつ、リクエストの振る舞いを検証しています。」
回答のポイント
App\Exceptions\Handler で集中管理。abort() や独自例外を投げ、環境で表示を切替(本番は詳細を隠す)。
自分の言葉での一言
「例外はHandlerで一元的に扱い、本番では詳細を隠して安全なエラー画面を返すようにします。」