Laravel 基礎学習/Route の仕組みと書き方
Laravel の Route は、URL と処理を結びつけるための重要な仕組み。
本記事では、Laravel Route の基本的な仕組みと書き方を解説する。
Route とは
Laravel では、
基本的に以下の流れで処理が行われる。
ブラウザアクセス
Route
URL に対応する Controller を決定
Controller
必要な処理を実行
Model
DB操作が必要な場合に利用する
View
ブラウザへ表示する HTML を生成
ブラウザへ表示
Laravel の Route は、
ユーザーからのリクエスト時に最初に通る処理。
Route では、
- URL を受け取る
- HTTP メソッドを判定する
- 実行する Controller を決める
- 必要に応じて URL の値を Controller に渡す
- 画面表示や登録処理の入り口になる
などを行う。
Laravel では、
ユーザーがブラウザでアクセスした URL に対して、
どの機能を実行するかを Route が決定する。
例えば、
https://example.com/posts
にアクセスされた場合、
Route が投稿一覧を表示する Controller を呼び出し、
一覧画面を表示する処理を実行する。
Route は、
URL に応じて実行する処理を振り分ける案内窓口のような役割を持つ。
Route ファイルの置き場所
Laravel では、プロジェクト作成時に
Route ファイルが routes フォルダ内に自動で作成される。
routes フォルダには、
web.php や api.php などの Route ファイルがあり、
用途に応じて使い分ける。
例えば、
composer create-project laravel/laravel my-app
を実行すると、
以下のような Laravel プロジェクト一式が自動作成される。
my-app
├ app
├ bootstrap
├ config
├ database
├ public
├ resources
├ routes
├ storage
└ vendor
下記の Route ファイルが、
この中の routes フォルダ内へ配置される。
routes
├ web.php
├ api.php
├ channels.php
└ console.php
これらの Route ファイルは、
ブラウザからアクセスがあった時に、
Laravel が自動で読み込む。
Laravel は、
Route ファイルを確認し、
どの URL にどの処理を対応させるかを判定している。
一般的な Web アプリ開発では、
web.php
api.php
を使用するケースが多い。
web.php
web.php は、
ブラウザで表示する通常の Web ページ用 Route を書くファイル。
一般的な Web アプリの画面表示やフォーム送信処理などは、
基本的に web.php に書く。
例
- トップページ
- 一覧ページ
- 詳細ページ
- ログイン画面
api.php
api.php は、
API 用 Route を書くファイル。
主に JSON データを返す処理を書く。
例
- スマホアプリ向け API
- 外部サービス連携用 API
- JavaScript から取得する JSON
channels.php
channels.php は、
WebSocket やリアルタイム通信関連の設定を書くファイル。
チャット機能や通知機能などで使用する。
console.php
console.php は、
Artisan コマンドや定期実行処理関連を書くファイル。
ブラウザアクセス用 Route とは用途が異なる。
Route の基本構文
Route は、以下のような形で書く。
Route::HTTPメソッド('URL', 処理);
例
use App\Http\Controllers\PostController;
Route::get('/posts', [PostController::class, 'index']);
1行目 use の意味
この Route から使用したい Controller のファイルを指定している。
これを書くことで、 Route 内で PostController を使用できる。
2行目 Route::get() の意味
/posts に GET でアクセスされたら、
PostController の index メソッドを実行する。
1行目の記述がないとこれが動かない。
ここで例に挙げた PostController は、
Controller と呼ばれる役割を持つ PHP ファイル。
Controller は、 Route から呼び出され、ページを表示する前に必要な処理を行う。
つまり、
案内窓口である Route が、
「この URL にアクセスされたら PostController の処理を実行する」
と振り分けを行い、
実際の処理は Controller 側で行われる、
という流れ。
なお、今回の例はブラウザで画面を表示する一般的な Web アプリの処理なので、
routes/web.php
に記載する。
HTTP メソッド別 Route
HTTP メソッドとは、
ブラウザが「何をしたいのか」をサーバーへ伝えるための種類。
Laravel の Route では、
URL だけではなく、
HTTP メソッドも使って処理を振り分ける。
例えば、
同じ URL でも、
- 画面を表示したいのか
- データを登録したいのか
- データを更新したいのか
- データを削除したいのか
によって、
実行する処理が変わる。
そのため Laravel では、
HTTP メソッドごとに Route を書き分ける。
GET Route
GET は、
画面表示に使用する HTTP メソッド。
投稿一覧画面や投稿詳細画面など、
ブラウザでページを開く処理に使う。
例
Route::get('/posts', [PostController::class, 'index']);
意味
/posts に GET でアクセスされたら、
PostController の index メソッドを実行する。
よく使う場面
- 一覧画面表示
- 詳細画面表示
- 作成フォーム表示
- 編集フォーム表示
POST Route
POST は、
新しいデータを登録する時によく使う HTTP メソッド。
フォームから送信された内容を DB に保存する処理に使う。
例
Route::post('/posts', [PostController::class, 'store']);
意味
/posts に POST で送信されたら、
PostController の store メソッドを実行する。
よく使う場面
- 新規登録
- 問い合わせ送信
- ログイン処理
- フォーム送信
PUT / PATCH Route
PUT / PATCH は、
既存データを更新する時によく使う HTTP メソッド。
Laravel では、
更新処理に PUT または PATCH を使用することが多い。
例
Route::put('/posts/{id}', [PostController::class, 'update']);
意味
/posts/{id} に PUT で送信されたら、
PostController の update メソッドを実行する。
よく使う場面
- 投稿更新
- プロフィール更新
- 設定変更
DELETE Route
DELETE は、
既存データを削除する時によく使う HTTP メソッド。
例
Route::delete('/posts/{id}', [PostController::class, 'destroy']);
意味
/posts/{id} に DELETE で送信されたら、
PostController の destroy メソッドを実行する。
よく使う場面
- 投稿削除
- コメント削除
- データ削除
10)Route の順番に注意
Route は、上から順番に判定される。
そのため、書く順番が重要になる場合がある。
例
Route::get('/posts/create', [PostController::class, 'create']);
Route::get('/posts/{id}', [PostController::class, 'show']);
この順番なら問題ない。
しかし、逆に書くと、
/posts/create
が、
/posts/{id}
に一致してしまう可能性がある。
つまり Laravel が、
create
を id として扱ってしまう可能性がある。
そのため、
/posts/create
のような固定 URL は、
/posts/{id}
のような可変 URL より先に書くことが多い。
Route 名
Route には名前を付けることができる。
例
Route::get('/login', [LoginController::class, 'index'])->name('login');
この場合、
/login
の Route に、
login
という名前を付けている。
Route 名を使わない場合
<a href="/login">ログイン</a>
このように、
URL を直接書くことになる。
Route 名を使う場合
<a href="{{ route('login') }}">ログイン</a>
route(‘login’) を使うと、
Route 名から URL を自動生成できる。
なぜ使うのか
URL を直接書くと、
後から URL を変更した時に修正箇所が増える。
例えば、
/login
/user/login
に変更した場合、
URL を直接書いている箇所を全て修正する必要がある。
しかし、
Route 名を使っていれば、
Route 定義側だけ修正すれば済む。
Route グループ
Route グループを使うと、
共通の URL や設定をまとめて書くことができる。
Route が増えてくると、
同じ記述を何度も書く場面が増える。
そのような場合に、
Route グループを使用すると管理しやすくなる。
prefix
prefix は、
URL の共通部分をまとめるために使う。
通常の書き方
Route::get('/admin/posts/create', [AdminPostController::class, 'create']);
Route::post('/admin/posts', [AdminPostController::class, 'store']);
このように、
/admin
を毎回書く必要がある。
prefix を使う場合
Route::prefix('admin')->group(function () {
Route::get('/posts/create', [AdminPostController::class, 'create']);
Route::post('/posts', [AdminPostController::class, 'store']);
});
この場合、
実際の URL は以下になる。
/admin/posts/create
/admin/posts
prefix を使うことで、
/admin
を共通化できる。
また、グループ化することで、「この Route 群は管理画面用」ということが視覚的にも分かりやすくなる。
name
name は、
Route 名の共通部分をまとめるために使う。
例
Route::name('admin.')->group(function () {
Route::get('/posts', [AdminPostController::class, 'index'])->name('posts.index');
});
この場合、
Route 名は以下になる。
admin.posts.index
prefix と name を組み合わせる例
Route::prefix('admin')
->name('admin.')
->group(function () {
Route::get('/posts', [AdminPostController::class, 'index'])->name('posts.index');
});
この場合、
URL
/admin/posts
Route 名
admin.posts.index
になる。
このように Route グループを使用すると、
URL や Route 名の共通部分をまとめて管理できる。
また、
admin
という共通ルールを付けることで、
「管理画面用の Route」
ということも視覚的に分かりやすくなる。
Resource Route
Laravel では、
CRUD 用の Route をまとめて登録することができる。
CRUD とは、
データ操作でよく使う基本機能のこと。
- Create(登録)
- Read(取得・表示)
- Update(更新)
- Delete(削除)
一般的な Web アプリでは、
これらの機能をセットで作ることが多い。
例えば、
投稿機能を作る場合、
- 投稿一覧表示
- 投稿詳細表示
- 投稿作成
- 投稿更新
- 投稿削除
などの機能が必要になる。
これらを通常通り書くと、
Route が大量になる。
通常の書き方
Route::get('/posts', [PostController::class, 'index']);
Route::get('/posts/create', [PostController::class, 'create']);
Route::post('/posts', [PostController::class, 'store']);
Route::get('/posts/{id}', [PostController::class, 'show']);
Route::get('/posts/{id}/edit', [PostController::class, 'edit']);
Route::put('/posts/{id}', [PostController::class, 'update']);
Route::delete('/posts/{id}', [PostController::class, 'destroy']);
Laravel では、
これらをまとめて登録できる。
Resource Route の書き方
Route::resource('posts', PostController::class);
これだけで、
CRUD 用 Route が自動登録される。
対応する Controller メソッド
Resource Route は、
以下の Controller メソッドと対応している。
| メソッド名 | 役割 | URL 例 |
|---|---|---|
| index | 一覧表示 | /posts |
| create | 作成フォーム表示 | /posts/create |
| store | 登録処理 | /posts |
| show | 詳細表示 | /posts/1 |
| edit | 編集フォーム表示 | /posts/1/edit |
| update | 更新処理 | /posts/1 |
| destroy | 削除処理 | /posts/1 |
このように、
Laravel では CRUD の基本構成がある程度決まっている。
そのため、
Route::resource()
を使うことで、
一般的な CRUD 用 Route をまとめて定義できる。
Route 一覧を確認する
登録されている Route を確認するには、
以下のコマンドを使用する。
Laravel では、
「Artisan(アーティザン)」と呼ばれる専用のコマンドツールが用意されている。
ターミナルで、
php artisan ○○
のような形式で実行することで、
Laravel の各種機能を操作できる。
Route 一覧を確認する場合は、
php artisan route:list
を使用する。
実行場所
このコマンドは、
ターミナルで Laravel プロジェクトフォルダへ移動した状態で実行する。
例
cd ~/Herd/my-app
php artisan route:list
確認できること
- HTTP メソッド
- URL
- Route 名
- 実行される Controller
- 実行されるメソッド
実行結果例
GET posts posts.index PostController@index
POST posts posts.store PostController@store
GET posts/{post} posts.show PostController@show
route:list を使う利点
Route が増えてくると、
「どの URL が登録されているのか」
「どの Controller が実行されるのか」
が分かりづらくなる。
そのような場合に、
php artisan route:list
を使うことで、
現在 Laravel に登録されている Route を一覧で確認できる。
URL の登録ミス確認や、
Route 名確認、
Resource Route で自動生成された Route 確認などでもよく使用される。
Route と View の関係
Laravel では、
基本的に以下の流れで処理が行われる。
Route
↓
Controller
↓
View
まず、
Route が URL を受け取り、
実行する Controller を決定する。
Controller では、
DB アクセスやログイン判定などの必要な処理を行い、
最後に View を返す。
View は、
画面表示用ファイルのこと。
HTML や Blade テンプレートなどを書き、
ブラウザへ表示する画面を作成する。
ただし、
Laravel では、
Controller を経由せず、
Route から直接 View を返すこともできる。
例
Route::get('/about', function () {
return view('about');
});
この場合、
/about
にアクセスすると、
resources/views/about.blade.php
が表示される。
Laravel では、画面表示用ファイルとして「ファイル名.blade.php」を使用する。
このように、
小さいページであれば、
Route から直接 View を返しても問題ない。
ただし、
実際のアプリでは、
- DB からデータ取得
- ログイン判定
- バリデーション
- 権限制御
- 登録処理
- 更新処理
- 削除処理
- 複雑な条件分岐
などの処理が必要になることが多い。
そのため、
実際の Laravel 開発では、
Route から Controller を呼び出し、
Controller 側で処理を行う構成が一般的。
Controller を使う例
Route::get('/posts', [PostController::class, 'index']);
この場合、
/posts
にアクセスすると、
PostController の index メソッドが実行される。
まとめ:Route の役割
Route は、
ユーザーからのリクエストを受け取り、
実行する処理を振り分ける仕組み。
Laravel では、
ブラウザからのアクセスは、
まず Route を通る。
Route によって、
- どの URL か
- どの HTTP メソッドか
- どの Controller を実行するか
- どのメソッドを実行するか
が決定される。
Route を理解すると、
Laravel アプリ全体の処理の流れがかなり分かりやすくなる。