LLaravel Bootcamp

Day 1MVCとリクエストライフサイクル、Laravelを選ぶ理由

MVCとは何か、各層の責務

Model・View・Controllerがそれぞれ何を担当するのか、なぜ分けるのかを理解する。

MVCは「役割分担」の設計

とは、アプリのコードを「Model(モデル)」「View(ビュー)」「Controller(コントローラ)」という3つの役割に分けて整理する設計パターンです。前のレッスンで見た「全部が1ファイルに混ざった状態」を、役割ごとにきれいに分ける考え方だと思ってください。

  • Model(モデル): データとビジネスルールを担当。DBとのやり取りや「1件いくら」といった業務ロジックを持つ。
  • View(ビュー): 見た目を担当。受け取ったデータをHTMLとして表示する。Laravelでは というテンプレートを使う。
  • Controller(コントローラ): 司令塔。リクエストを受け取り、Modelにデータを取りに行かせ、その結果をViewに渡す。

なぜ3つに分けるのか

分ける理由は「変更の影響範囲を閉じ込めるため」です。たとえば見た目だけ変えたいときはViewだけ触れば済み、データの取り方を変えたいときはModelだけ触れば済みます。役割が混ざっていると、見た目を変えるつもりが業務ロジックまで壊す、といった事故が起きます。責務を分けることで、変更に強く、テストしやすいコードになります。

各層のコードイメージ

PHP
<?php
// Controller: 司令塔。自分では重い処理をしない
namespace App\Http\Controllers;

use App\Models\User;

class UserController extends Controller
{
    public function show(int $id)
    {
        // Modelにデータ取得を依頼する
        $user = User::findOrFail($id);

        // Viewにデータを渡して表示を任せる
        return view("users.show", ["user" => $user]);
    }
}
Controllerは「受け取って、頼んで、渡す」だけ。処理の中身はModelとViewに任せる。
PHP
<?php
// Model: データと業務ルールを持つ
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // 業務ルールの例: プレミアム会員かどうかの判定はModelの責務
    public function isPremium(): bool
    {
        return $this->plan === "premium";
    }
}
「プレミアム会員か」という業務判断はModelが持つ。Controllerに書くと再利用できず散らばる。
Blade
{{-- View (resources/views/users/show.blade.php): 表示だけを担当 --}}
<h1>{{ $user->name }} さんのプロフィール</h1>

@if ($user->isPremium())
  <span class="badge">プレミアム会員</span>
@endif
Viewは渡されたデータを表示するだけ。{{ }} は自動でエスケープされXSSを防ぐ。

よくあるアンチパターン: ファットコントローラ

本来Modelに置くべき業務ロジックやDB操作をControllerに書き続けると、Controllerが肥大化します。これを (ファットコントローラ)と呼び、テストしにくく再利用もできない典型的なアンチパターンです。

悪い例: ロジックをControllerに直書き

PHP
public function show(int $id)
{
    $user = User::find($id);
    // 業務判断をControllerに書いてしまっている
    if ($user->plan === "premium" && $user->paid_until > now()) {
        $badge = "プレミアム";
    }
    return view("users.show", compact("user", "badge"));
}

良い例: 業務判断はModelに寄せる

PHP
public function show(int $id)
{
    $user = User::findOrFail($id);
    // 判断はModelのメソッドに任せる
    return view("users.show", ["user" => $user]);
}
// Model側に isPremium() を持たせ、Viewから $user->isPremium() を呼ぶ

面接ではこう言う

「MVCは役割分担の設計で、Modelがデータと業務ルール、Viewが表示、Controllerが両者をつなぐ司令塔です。分ける目的は変更の影響範囲を閉じ込め、テストしやすくすることです。業務ロジックをControllerに書くとファットコントローラになるので、Modelやサービス層に寄せるよう意識しています」と言えると、設計を理解していると伝わります。

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

理解度チェック

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

Q1

「ユーザーがプレミアム会員かどうかを判定する」ロジックは、MVCのどこに置くのが適切か。

Q2

MVCで責務を分ける「最大の目的」はどれか。

Q3

Model・View・Controllerそれぞれの責務を、一言ずつで説明してください。

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