Day 1・MVCとリクエストライフサイクル、Laravelを選ぶ理由
MVCとは何か、各層の責務
Model・View・Controllerがそれぞれ何を担当するのか、なぜ分けるのかを理解する。
MVCは「役割分担」の設計
とは、アプリのコードを「Model(モデル)」「View(ビュー)」「Controller(コントローラ)」という3つの役割に分けて整理する設計パターンです。前のレッスンで見た「全部が1ファイルに混ざった状態」を、役割ごとにきれいに分ける考え方だと思ってください。
- Model(モデル): データとビジネスルールを担当。DBとのやり取りや「1件いくら」といった業務ロジックを持つ。
- View(ビュー): 見た目を担当。受け取ったデータをHTMLとして表示する。Laravelでは というテンプレートを使う。
- Controller(コントローラ): 司令塔。リクエストを受け取り、Modelにデータを取りに行かせ、その結果をViewに渡す。
なぜ3つに分けるのか
分ける理由は「変更の影響範囲を閉じ込めるため」です。たとえば見た目だけ変えたいときはViewだけ触れば済み、データの取り方を変えたいときはModelだけ触れば済みます。役割が混ざっていると、見た目を変えるつもりが業務ロジックまで壊す、といった事故が起きます。責務を分けることで、変更に強く、テストしやすいコードになります。
各層のコードイメージ
<?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]);
}
}<?php
// Model: データと業務ルールを持つ
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
// 業務ルールの例: プレミアム会員かどうかの判定はModelの責務
public function isPremium(): bool
{
return $this->plan === "premium";
}
}{{-- View (resources/views/users/show.blade.php): 表示だけを担当 --}}
<h1>{{ $user->name }} さんのプロフィール</h1>
@if ($user->isPremium())
<span class="badge">プレミアム会員</span>
@endifよくあるアンチパターン: ファットコントローラ
本来Modelに置くべき業務ロジックやDB操作をControllerに書き続けると、Controllerが肥大化します。これを (ファットコントローラ)と呼び、テストしにくく再利用もできない典型的なアンチパターンです。
悪い例: ロジックをControllerに直書き
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に寄せる
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に噛み砕いてもらいましょう。
理解度チェック
答えられれば、面接で説明できる状態に一歩近づきます。
「ユーザーがプレミアム会員かどうかを判定する」ロジックは、MVCのどこに置くのが適切か。
MVCで責務を分ける「最大の目的」はどれか。
Model・View・Controllerそれぞれの責務を、一言ずつで説明してください。
記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。