【Laravel】LaravelのRoute設計で迷わないための整理術

laravelアイキャッチ Laravel

こんにちは、かつコーチです。

前回は Route::get を使った基本のルーティングを解説しました。

小さなアプリならそれで十分ですが、機能が増えてくると routes/web.php はあっという間に肥大化します。

私自身、個人開発でルートが100行を超えたあたりから「このURL、どこで定義したっけ」と探し回るようになった経験があります。

今回は、ルートが増えても迷わないための整理術をまとめて解説します。

なぜRoute設計を整理する必要があるのか

ルートが増えると起きる問題

Route::get をベタ書きし続けると、次のような問題が起きやすくなります。

  • 似たようなURLがあちこちに散らばり、重複や漏れに気づきにくい
  • URLの命名がバラバラで、他の開発者(未来の自分も含む)が読みづらい
  • 認証が必要なルートとそうでないルートが混在し、設定漏れが起きやすい

これらはコードが動かなくなるバグではなく、「気づいたときには手遅れ」になりやすい保守性の問題です。

だからこそ、ルートが少ないうちから整理のルールを持っておくことが大切です。

整理の3本柱

Route設計を整理する方法は、大きく分けて次の3つです。

  1. 命名規則:URLとルート名の付け方を統一する
  2. route:name:ルートに名前をつけて、URL文字列への依存をなくす
  3. グループ化:似た性質のルートをまとめる

順番に見ていきましょう。

命名規則を統一する

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.phpname() を修正するだけで、リンクを貼っているすべての箇所に変更が反映されます。

私が最初にこの仕組みを知らなかったとき、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での生成方法

タイトルとURLをコピーしました