ブラウザーからルートを経てControllerへ進み、必要に応じてModelを利用し、ViewでHTMLを返すMVCの関係

説明と確認結果は2026年10月時点のものです。

PHPで画面を作ったことがあっても、Laravelのプロジェクトを開くと、ルート、コントローラー、Bladeなど、編集先がいくつも出てきます。
私も、MVCという役割分担は他のフレームワークと共通する考え方だと捉えていますが、Laravelで各ファイルをどう関連付けるかは、慣れるまで分かりにくいと感じています。
そこで、URLを振り分けるルートから、呼び出すメソッド、表示するファイルまでを一つずつ追って整理することにしました。

この記事では、PHPの基本文法を使ったことがある方に向けて、Laravelで画面を作る順番を整理します。
名前を入力する画面を例に、MVCの役割と3つのファイルのつながりを図・表・コードで見ていきます。
対象はLaravel 13で、サンプルはLaravel Framework 13.35.0で確認しています。

まず、作る画面と必要なファイルを決める

作るのは、名前を入力すると挨拶を返す小さな画面です。
この記事では既存サンプルのコードを読むことに絞り、各ファイルを結ぶ指定を確認します。
Laravelプロジェクトが用意されている方が対象です。
以下は挨拶フォームの実装からの抜粋であり、断片を貼るだけでフォーム全体が完成する手順ではありません。
完成したサンプル画面は次のようになります。

名前を入力して挨拶を返す完成画面
決めること このサンプルの内容
開くURL /learning/greeting
最初に表示するもの 名前の入力欄と送信ボタン
送信したあとの結果 こんにちは、おじちくさん!のような挨拶
名前を保存するか DBに保存する処理は設けない
作成・編集するファイル Blade、コントローラー、routes/web.phpの3つ

Laravelでは、画面のURLと実ファイル名を別々に決められます。
/learning/greetingへアクセスしても、その名前のPHPファイルが直接開かれるわけではありません。
URLと処理の対応を、ルートに登録します。

MVCのどこに何を書くか

MVCは、Model・View・Controllerに役割を分けて考える構成です。
冒頭の図では、ルートをMVCへ入る手前に置いています。
ルートは、URLとHTTPメソッドに対応する処理を選ぶ入口です。

要素 担当すること Laravelでの主な場所 今回の挨拶フォーム
Route(ルート) どのURLをどの処理へ渡すか routes/web.php GETとPOSTを別のメソッドへつなぐ
Controller 入力の受け取り、検証、処理の呼び出し、応答の選択 app/Http/Controllers/ GreetingController
View 渡されたデータをHTMLへ組み込む resources/views/ learning/greeting.blade.php
Model データと、そのデータを扱う処理をまとめる app/Models/ このサンプルでは使わない

LaravelのEloquentモデルは、DBのテーブルに対応するデータを取得・保存するときに使えます。
例えば保存済みの予定一覧を表示するなら、ControllerがModelを使って予定を取得し、その結果をViewへ渡す形が考えられます。
冒頭のModelとDBは、そのような機能の構成例です。
今回の挨拶フォームにDB処理を追加したという意味ではありません。

PHPで直接書いていた処理と比べると、移し先は次のように整理できます。

PHPで直接組み立てる場合 Laravelではどこに置くか
URLでアクセスするPHPファイルを決める routes/web.phpでURLと処理を登録
リクエストを受け取り、値を確認する Controller。検証が増えたらFormRequestへ分離できる
HTMLの中へPHP変数を表示する Bladeの{{ $name }}など
SQLでデータを読み書きする EloquentのModelやクエリービルダーなど

PHPの変数や配列が別の言語に変わるわけではありません。
Laravelが用意する入口や機能を使い、処理と表示を置く場所を分けていきます。

作る順番と、実行される順番を分ける

**画面を作る順番は、まずView、次にController、最後にRouteへつなぐ流れにすると追いやすくなります。
**
これは今回の説明で採用する順番です。
Laravelがこの順番を強制するわけではありません。

Viewで画面を作り、Controllerでデータを渡し、RouteでURLへつなぎ、ブラウザーで確認する作業順
作業順 何を作るか 編集先 この段階で決めること
1 画面のひな形 resources/views/learning/greeting.blade.php 入力欄・ボタン・結果をどこへ表示するか
2 画面へデータを渡す処理 app/Http/Controllers/GreetingController.php どのViewに、何という名前でデータを渡すか
3 URLと処理の対応 routes/web.php GETをControllerのどのメソッドへつなぐか
4 ブラウザーで確認 /learning/greeting 入力欄が表示されるか
5 送信処理を追加 同じ3ファイル POST、入力検証、挨拶の表示を追加する

一方、ブラウザーからアクセスされたときの順番は、Route → Controller → View → HTMLの応答です。
作成中は必要な部品を先に用意し、実行時にはURLからその部品を呼び出すと考えると、2つの順番を区別できます。
Modelを使う場合は、Controllerから必要なデータの取得・更新を呼びます。

1.Viewで画面を用意する

Laravelプロジェクトのartisanファイルがあるフォルダーで、ビューを作ります。

php artisan make:view learning.greeting --no-interaction

作成先はresources/views/learning/greeting.blade.phpです。
learning.greetingという指定のドットがフォルダーの区切りに対応します。
Bladeは、HTMLに変数の表示や条件分岐を書けるLaravelのテンプレート機能です。

挨拶の表示部分は、次のコードです。
完成版のBladeから、結果を表示する箇所だけを抜粋しています。

@if ($name !== null)
    <p id="greeting-result">こんにちは、{{ $name }}さん!</p>
@endif

最初に開いたときは$nameをnullにして、結果を出しません。
名前を渡されたときに挨拶を表示します。
{{ }}はHTML用にエスケープして出力するため、名前の中のタグがHTMLとして実行されることを防げます。
この抜粋だけではフォームの入力欄や送信先は作られません。
ここでは$nameという変数と表示の対応に注目してください。

2.ControllerからViewへデータを渡す

続いて、画面を返すコントローラーを作ります。

php artisan make:controller GreetingController --no-interaction

作成先はapp/Http/Controllers/GreetingController.phpです。
初回表示を担当するform()は次の内容です。
クラス全体ではなく、必要な型の読み込みとメソッドの抜粋です。

use Illuminate\Contracts\View\View;

public function form(): View
{
    return view('learning.greeting', ['name' => null]);
}

view()の第1引数が表示するView、第2引数がそのViewへ渡すデータです。
配列のキーnameが、Blade側の変数$nameになります。

Controllerで渡す指定 Bladeで使うもの
'learning.greeting' resources/views/learning/greeting.blade.php
['name' => null] $nameはnull。挨拶をまだ表示しない
['name' => 'おじちく'] $nameを挨拶へ埋め込める

ここまでで、画面のひな形と、それを返す処理が用意できます。
次に、このメソッドをURLから呼べるようにします。

3.RouteでURLとメソッドを結び付ける

routes/web.phpの対応する定義です。
useはファイル上部へ置き、同じ宣言がすでにある場合は重複させません。

use App\Http\Controllers\GreetingController;
use Illuminate\Support\Facades\Route;

Route::get('/learning/greeting', [GreetingController::class, 'form'])
    ->name('learning.greeting');

この1つのルートで、3か所がつながります。

読む箇所 意味
Route::get('/learning/greeting', ...) GETでこのURLが開かれたら処理する
[GreetingController::class, 'form'] GreetingControllerのform()を呼ぶ
Controllerのview('learning.greeting', ...) 対応するBladeへデータを渡してHTMLを作る
name('learning.greeting') URLを組み立てるためのルート名を付ける

ルート名とビュー名は別の仕組みです。
この例では同じ文字列を使っていますが、ルート名はroute('learning.greeting')でURLを作るために使い、ビュー名はview()で表示ファイルを指定するために使います。

開発サーバーを起動し、http://localhost:8000/learning/greetingを開くと、RouteからControllerへ進み、Viewで入力画面を作って返します。
完成済みのリポジトリで試す場合は、同じファイルやルートを追加し直す必要はありません。

同じ名前でも、ルート名とビュー名は別に確認する

このサンプルで迷いやすいのは、learning.greetingという文字列が別の目的で使われている点です。
名前が一致しているから自動で全ファイルが関連付くわけではありません。

つなぐ指定 何を探すか 次に読む場所
GETと/learning/greeting URLに対応する処理 routes/web.php
[GreetingController::class, 'form'] クラスとメソッド GreetingController::form()
view('learning.greeting', ...) ビュー名に対応するファイル resources/views/learning/greeting.blade.php
['name' => null] Viewへ渡すデータ Blade内の$name
name('learning.greeting') URLに付けた名前 route('learning.greeting')でURL生成

ルート名を変えても、それだけでBladeの保存場所が変わることはありません。
反対にBladeを移動した場合は、view()が指すビュー名を確認します。

完成済みサンプルでは、次のコマンドでURLと処理の対応を確認できます。
Laravelプロジェクトのartisanがあるフォルダーで実行します。

php artisan route:list --path=learning/greeting --no-interaction

GETはform、POSTはsubmitへ対応していることを確認します。
画面を開くまでの流れを追いたいときは、まずGETの行だけを見れば十分です。

まとめ

Laravelのファイルの関連は、URL・クラス名とメソッド名・ビュー名・データのキーを順に読むと追えます。
実行時はRouteからController、Viewへ進み、今回の作成手順はViewから必要な部品を用意する順番です。
この二つを分けると、次に何を作るかと、アクセス時に何が動くかを整理できます。
ModelやDBは必要な機能に合わせて加え、小さな表示確認の段階で全部品をそろえる必要はありません。

参考: Laravel 13のコントローラー、ビュー、ルーティング、Eloquentモデル、Blade