4.

Laravel ルーティング完全ガイド — Route::get/post / 名前付き / グループ / Resource

編集
この記事の要点
  • 基本: Route::get($uri, $callback) 系で URI とハンドラを結びつける(routes/web.php / routes/api.php
  • ルートパラメータ: /users/{id} でキャプチャ。{id?} で任意、where() で正規表現制約
  • 名前付きルート: ->name('users.show')route('users.show', $id) から URL 生成
  • グループ: Route::middleware([...])->prefix('admin')->group(...) で共通設定
  • Resource ルート: Route::resource('photos', PhotoController::class) 1 行で CRUD 7 ルート生成
  • 本番では php artisan route:cache でロード高速化(ルートを編集したら再キャッシュ必須)

基本ルートの書き方

// routes/web.php
use Illuminate\Support\Facades\Route;

// HTTP メソッド別
Route::get('/',          fn () => view('welcome'));
Route::post('/login',    [LoginController::class, 'store']);
Route::put('/users/{id}',[UserController::class, 'update']);
Route::patch('/users/{id}', [UserController::class, 'update']);
Route::delete('/users/{id}',[UserController::class, 'destroy']);

// 複数メソッド対応
Route::match(['get', 'post'], '/search', [SearchController::class, 'index']);
Route::any('/webhook', [WebhookController::class, 'handle']);

// ビューを直接返す
Route::view('/about', 'pages.about', ['title' => 'About']);

// リダイレクト
Route::redirect('/old', '/new', 301);

ルートパラメータ

// 必須パラメータ
Route::get('/users/{id}', function ($id) {
    return "User $id";
});

// 任意パラメータ
Route::get('/posts/{slug?}', function ($slug = 'default') {
    return "Post: $slug";
});

// 複数
Route::get('/users/{user}/posts/{post}', function ($user, $post) {
    return "User $user, Post $post";
});

// 正規表現制約
Route::get('/users/{id}', fn ($id) => "User $id")
    ->where('id', '[0-9]+');

Route::get('/articles/{slug}', fn ($slug) => "Article $slug")
    ->where('slug', '[a-z0-9\-]+');

// グローバル制約(RouteServiceProvider::boot)
Route::pattern('id', '[0-9]+');

// where ショートカット
Route::get('/posts/{id}', ...)->whereNumber('id');
Route::get('/users/{name}', ...)->whereAlpha('name');
Route::get('/posts/{slug}', ...)->whereAlphaNumeric('slug');
Route::get('/lang/{code}', ...)->whereIn('code', ['ja', 'en', 'zh']);

名前付きルートと URL 生成

// 名前を付ける
Route::get('/users/{id}', [UserController::class, 'show'])
    ->name('users.show');

// URL を生成する側
$url = route('users.show', ['id' => 1]);
// → https://example.com/users/1

// Blade
{{ $user->name }}

// リダイレクト
return redirect()->route('users.show', $user);

// 現在のルートが特定の名前か判定
if (request()->routeIs('users.*')) { ... }

ルートグループ(prefix / middleware / namespace)

// 管理画面: /admin/* で auth.admin ミドルウェア
Route::prefix('admin')
    ->name('admin.')
    ->middleware(['auth', 'can:access-admin'])
    ->group(function () {
        Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
        // 名前は admin.dashboard、URL は /admin/dashboard
        Route::resource('users', AdminUserController::class);
    });

// API v1
Route::prefix('api/v1')->middleware('throttle:60,1')->group(function () {
    Route::get('/users', [Api\UserController::class, 'index']);
});

// サブドメイン
Route::domain('{tenant}.example.com')->group(function () {
    Route::get('/dashboard', function ($tenant) {
        return "Tenant: $tenant";
    });
});

Resource ルート(CRUD 7 本まとめて)

Route::resource('photos', PhotoController::class);

// これ 1 行で次の 7 ルートが作られる
// GET    /photos              photos.index    list
// GET    /photos/create       photos.create   form (new)
// POST   /photos              photos.store    create
// GET    /photos/{photo}      photos.show     read
// GET    /photos/{photo}/edit photos.edit     form (edit)
// PUT    /photos/{photo}      photos.update   update
// DELETE /photos/{photo}      photos.destroy  delete

// 一部だけ
Route::resource('photos', PhotoController::class)->only(['index', 'show']);
Route::resource('photos', PhotoController::class)->except(['destroy']);

// API リソース(create / edit を除外)
Route::apiResource('photos', PhotoController::class);

// 複数まとめて
Route::apiResources([
    'photos' => PhotoController::class,
    'posts'  => PostController::class,
]);

Route Model Binding

パラメータをそのまま Eloquent モデルに自動変換できます:

// /users/1 → $user = User::findOrFail(1)
Route::get('/users/{user}', function (User $user) {
    return $user->name;   // 自動的に Model インスタンス
});

// id 以外をキーにする
Route::get('/posts/{post:slug}', function (Post $post) {
    return $post->title;
});

// モデルで明示
class Post extends Model {
    public function getRouteKeyName() {
        return 'slug';
    }
}

ルート一覧とキャッシュ

# ルート一覧を確認
php artisan route:list
php artisan route:list --path=admin
php artisan route:list --method=POST

# 本番ではルートをコンパイル(高速化)
php artisan route:cache

# ルートを変更したら必ずクリア
php artisan route:clear

# 本番デプロイ時の標準セット
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache

web.php と api.php の違い

項目web.phpapi.php
URL プレフィックスなし/api
ミドルウェアグループweb(セッション・CSRF・Cookie)api(throttle:api のみ)
セッションありなし
CSRF 保護ありなし
用途ブラウザ用SPA / モバイル API

カスタムミドルウェアとフォールバック

// ミドルウェア指定
Route::get('/admin', ...)->middleware('auth', 'can:admin');
Route::get('/x', ...)->withoutMiddleware(['throttle:60,1']);

// 404 フォールバック
Route::fallback(function () {
    return view('errors.404');
});

FAQ

Q: ルート定義の順序は重要?
A: 重要。/users/create/users/{id} よりに書かないと、create{id} に拾われます。

Q: クロージャでなくコントローラを使うべき?
A: 簡単な処理はクロージャ可。ただし route:cache が効くのはクロージャを使っていないときのみ。本番ではコントローラ推奨。

Q: API のレート制限を変えたい
A: Route::middleware('throttle:60,1')(60 req/分)。詳細は RouteServiceProvider::configureRateLimiting() でカスタム定義。

編集
Post Share
子ページ
  1. ルーティング一覧の確認方法
  2. ルーティングのグループ化
同階層のページ
  1. インストールと設定
  2. クイックスタート & チュートリアル(初心者向け)
  3. クイックスタート & チュートリアル(中級者向け)
  4. ルーティング
  5. Bladeテンプレート(ビュー/レイアウト)
  6. コントローラー
  7. マイグレーションとテーブル定義
  8. データベースの設定
  9. Eloquentモデル (ORM)
  10. SQLとクエリビルダー
  11. バリデーション
  12. .envファイルの設定値へのアクセス
  13. 動作環境による分岐処理
  14. configフォルダ配下の設定値へのアクセス
  15. assetヘルパーを利用したpublicフォルダへのアクセス
  16. storageフォルダへのアクセス
  17. アプリケーション名の変更
  18. メンテナンス
  19. ログイン画面(認証システム)の作成
  20. ログインの必須化
  21. ログインユーザー情報の取得
  22. ルートの認証化
  23. 本番サーバーへのデプロイ方法
  24. 多言語化
  25. csrf_field
  26. ファイルのダウンロード
  27. CSVのアップロードおよび読み込み(maatwebsite/excel)
  28. ページタイトルの設定
  29. コマンド一覧
  30. エラー一覧
  31. SQLの実行ログ出力方法
  32. キャッシュのクリア
  33. Selectの結果の最初もしくは最後に任意の値を追加する方法
  34. ajaxでPOST通信する際の注意点
  35. ソーシャルログインの実装
  36. セッション情報の確認
  37. ログイン、ユーザー登録、パスワードリセット後のリダイレクト先の変更方法
  38. redirectやreturn viewにメッセージを付与する方法
  39. クッキー(cookie)の設定と取得
  40. クラスの再読み込み
  41. csrfの有効時間を変更する方法
  42. ViewComposerを用いてviewに共通の値を付与する方法
  43. View::shareを用いて共通の値を各ビューに渡す方法
  44. ミドルウェアを用いた処理の共通化
  45. Middleware内でAuth::check()などを使用する方法
  46. Controller以外でリダイレクトする方法
  47. セッションの値の取得/保存/更新/削除
  48. $requestの値を変更する方法
  49. 常時SSL化
  50. ページング(ページネーション)をする方法
  51. vue.jsとの連携
  52. Vue.jsと連携するSPA実行環境構築
  53. .envの値をvue.jsで参照する方法
  54. vue.jsを本番環境にリリースする方法
  55. could not find driver(Windows, MySQL編)