こんにちは、かつコーチです。
前回は Route::get を使った基本のルーティングを解説しました。
小さなアプリならそれで十分ですが、機能が増えてくると routes/web.php はあっという間に肥大化します。
私自身、個人開発でルートが100行を超えたあたりから「このURL、どこで定義したっけ」と探し回るようになった経験があります。
今回は、ルートが増えても迷わないための整理術をまとめて解説します。
なぜRoute設計を整理する必要があるのか
ルートが増えると起きる問題
Route::get をベタ書きし続けると、次のような問題が起きやすくなります。
- 似たようなURLがあちこちに散らばり、重複や漏れに気づきにくい
- URLの命名がバラバラで、他の開発者(未来の自分も含む)が読みづらい
- 認証が必要なルートとそうでないルートが混在し、設定漏れが起きやすい
これらはコードが動かなくなるバグではなく、「気づいたときには手遅れ」になりやすい保守性の問題です。
だからこそ、ルートが少ないうちから整理のルールを持っておくことが大切です。
整理の3本柱
Route設計を整理する方法は、大きく分けて次の3つです。
- 命名規則:URLとルート名の付け方を統一する
- route:name:ルートに名前をつけて、URL文字列への依存をなくす
- グループ化:似た性質のルートをまとめる
順番に見ていきましょう。
命名規則を統一する
RESTfulなURL設計を意識する
まず意識したいのが、RESTful(リソースを中心にURLを設計する考え方)なURL設計です。
たとえば「記事(articles)」を扱う機能なら、次のような対応がよく使われます。
| 操作 | URL | 意味 |
|---|---|---|
| 一覧表示 | GET /articles | 記事の一覧を見る |
| 詳細表示 | GET /articles/{id} | 特定の記事を見る |
| 作成フォーム | GET /articles/create | 新規作成画面を開く |
| 作成処理 | POST /articles | 記事を新規登録する |
| 編集フォーム | GET /articles/{id}/edit | 編集画面を開く |
| 更新処理 | PUT /articles/{id} | 記事を更新する |
| 削除処理 | DELETE /articles/{id} | 記事を削除する |
「動詞(get, create, update)」ではなく「名詞(articles)」を中心に据え、操作の種類はHTTPメソッド(GET/POST/PUT/DELETE)で表す、というのがポイントです。
わかりやすいURLとわかりにくいURLの比較
命名がバラバラだと、後から見たときに何のページか判断しづらくなります。
❌ Before:動詞や表記がバラバラなURL
<?php
use Illuminate\Support\Facades\Route;
Route::get('/getArticleList', function () {
// 記事一覧
});
Route::get('/article_detail/{id}', function ($id) {
// 記事詳細
});
Route::get('/newArticle', function () {
// 新規作成フォーム
});
キャメルケース・スネークケース・動詞の付け方がバラバラで、統一感がありません。
規模が大きくなるほど「どのルールで書けばいいか」が曖昧になり、開発者ごとに書き方が変わってしまいます。
✅ After:RESTfulな考え方で統一したURL
<?php
use Illuminate\Support\Facades\Route;
Route::get('/articles', function () {
// 記事一覧
});
Route::get('/articles/{id}', function ($id) {
// 記事詳細
});
Route::get('/articles/create', function () {
// 新規作成フォーム
});
URLはすべて articles を軸にした複数形・小文字・ハイフン区切りに統一されており、URLを見ただけで「記事に関する何かのページだ」と判断できます。
このルールに沿っておけば、後で説明するArtisanのリソースコントローラとも自然に噛み合います。
ルートに名前をつける(route:name)
なぜ名前が必要なのか
Laravelのルートには、name() メソッドで名前をつけられます。
<?php
use Illuminate\Support\Facades\Route;
Route::get('/articles/{id}', function ($id) {
// 記事詳細
})->name('articles.show');
一見地味な機能ですが、これがないとBladeテンプレートやリダイレクト処理の中で、URLを直接文字列として書くことになります。
❌ Before:URLを直接文字列で書く
<a href="/articles/{{ $article->id }}">記事を見る</a>
このコードは動きますが、後から /articles/{id} を /posts/{id} にURL変更したくなった場合、このリンクをすべて手作業で書き換える必要があります。
規模が大きいアプリでは、書き換え漏れがそのままリンク切れにつながります。
✅ After:route()ヘルパーでルート名を参照する
<a href="{{ route('articles.show', $article->id) }}">記事を見る</a>
route() ヘルパーはルート名からURLを自動生成してくれるので、URLの構造を変えても、routes/web.php の name() を修正するだけで、リンクを貼っているすべての箇所に変更が反映されます。
私が最初にこの仕組みを知らなかったとき、URLを1か所変更しただけのつもりが、リンク切れがあちこちで発生して青ざめたことがあります。
「URLは変わりうるが、名前は変わりにくい」という前提でルートを設計するのが安全です。
命名のルール
ルート名は リソース名.操作 の形でつけるのが一般的です。
<?php
use Illuminate\Support\Facades\Route;
Route::get('/articles', function () {
//
})->name('articles.index');
Route::get('/articles/create', function () {
//
})->name('articles.create');
Route::get('/articles/{id}', function ($id) {
//
})->name('articles.show');
index(一覧)、create(作成フォーム)、show(詳細)といった名前は、後述するリソースコントローラの標準メソッド名とも一致しているため、あわせて覚えておくと理解が早くなります。
似た性質のルートをグループ化する
prefixとnameでまとめる
管理者用のページなど、「共通のURLの接頭辞」や「共通のルート名の接頭辞」を持つルートが増えてきたら、Route::prefix() と Route::name() を使ってグループ化できます。
<?php
use Illuminate\Support\Facades\Route;
Route::prefix('admin')->name('admin.')->group(function () {
Route::get('/dashboard', function () {
//
})->name('dashboard');
Route::get('/users', function () {
//
})->name('users');
});
このコードでは、/admin/dashboard(ルート名:admin.dashboard)と /admin/users(ルート名:admin.users)が定義されます。
管理画面用のルートがひと目で分かるようにまとまり、admin という接頭辞をルートごとに書く手間もなくなります。
middlewareもまとめて指定できる
グループ化は、次回解説するMiddleware(認証チェックなどの共通処理)とも相性がよく、次のように組み合わせられます。
<?php
use Illuminate\Support\Facades\Route;
Route::middleware('auth')->group(function () {
Route::get('/mypage', function () {
// ログイン済みユーザーだけがアクセスできるページ
})->name('mypage');
});
「このグループの中のルートは全部ログイン必須」ということが、コードの見た目からも一目で分かるようになります。
まとめ
この記事のポイント
- ルートが増えてくると、命名や整理のルールがないと保守しづらくなる
- URLはRESTfulな考え方に沿って、名詞+HTTPメソッドで設計する
name()でルートに名前をつけ、route()ヘルパーでURLを参照するとURL変更に強くなるRoute::prefix()とRoute::name()で、共通のURL・ルート名を持つグループをまとめられる- グループ化はMiddlewareとも組み合わせやすい
次に読むべき記事
Route設計の整理ができたら、次は実際の処理をどこに書くか、Controllerの作り方を見ていきましょう。
→ 次の記事:Controllerの作り方とArtisanでの生成方法