
説明と確認結果は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がこの順番を強制するわけではありません。

| 作業順 | 何を作るか | 編集先 | この段階で決めること |
|---|---|---|---|
| 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-interactionGETはform、POSTはsubmitへ対応していることを確認します。
画面を開くまでの流れを追いたいときは、まずGETの行だけを見れば十分です。
まとめ
Laravelのファイルの関連は、URL・クラス名とメソッド名・ビュー名・データのキーを順に読むと追えます。
実行時はRouteからController、Viewへ進み、今回の作成手順はViewから必要な部品を用意する順番です。
この二つを分けると、次に何を作るかと、アクセス時に何が動くかを整理できます。
ModelやDBは必要な機能に合わせて加え、小さな表示確認の段階で全部品をそろえる必要はありません。