この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:16
ページ更新者:atom
更新日時:2026-06-11 07:07:02

タイトル: ルーティング
SEOタイトル: 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() でカスタム定義。