あっぽログ
← 記事一覧に戻る

LaravelのルーティングをRESTful APIで理解する:基本から名前付きルート・ミドルウェアまで

はじめに

Laravelでウェブアプリケーションを開発するとき、最初に理解すべき重要な概念が ルーティング です。ルーティングとは「このURLにアクセスが来たときに、どの処理を実行するか」を定義する仕組みです。

この記事では、Laravelのルーティングを基本から学び、RESTful APIの設計まで実践的に解説します。


基本的なルーティング

Laravelのルートは routes/web.php(Webアプリ用)または routes/api.php(API用)に定義します。

最もシンプルなルートは以下のように書きます。

use Illuminate\Support\Facades\Route;

// GETリクエストを受け取る
Route::get('/hello', function () {
    return 'Hello, Laravel!';
});

// ビューを返す
Route::get('/about', function () {
    return view('about');
});

使用できるHTTPメソッド

Laravelは主要なHTTPメソッドすべてに対応しています。

Route::get('/items', function () { /* 一覧取得 */ });
Route::post('/items', function () { /* 新規作成 */ });
Route::put('/items/{id}', function ($id) { /* 更新 */ });
Route::patch('/items/{id}', function ($id) { /* 部分更新 */ });
Route::delete('/items/{id}', function ($id) { /* 削除 */ });

コントローラーへの紐付け

実際の開発では、クロージャではなく コントローラー にロジックをまとめるのがベストプラクティスです。

まずコントローラーを生成します。

php artisan make:controller ItemController

生成されたコントローラーにメソッドを追加します。

// app/Http/Controllers/ItemController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ItemController extends Controller
{
    public function index()
    {
        return response()->json(['items' => []]);
    }

    public function show($id)
    {
        return response()->json(['id' => $id]);
    }

    public function store(Request $request)
    {
        // バリデーション・保存処理
        return response()->json(['message' => '作成しました'], 201);
    }

    public function destroy($id)
    {
        return response()->json(['message' => '削除しました']);
    }
}

ルートとコントローラーを紐付けます。

use App\Http\Controllers\ItemController;

Route::get('/items', [ItemController::class, 'index']);
Route::get('/items/{id}', [ItemController::class, 'show']);
Route::post('/items', [ItemController::class, 'store']);
Route::delete('/items/{id}', [ItemController::class, 'destroy']);

リソースルートでRESTfulに一括定義

上記のような7つの標準アクション(index / create / store / show / edit / update / destroy)を一行で定義できるのが Route::resource です。

// 7つのルートをまとめて定義
Route::resource('items', ItemController::class);

これ一行で以下のルートが自動生成されます。

メソッドURIアクション
GET/itemsindex
GET/items/createcreate
POST/itemsstore
GET/items/show
GET/items//editedit
PUT/PATCH/items/update
DELETE/items/destroy

APIでビュー不要の場合は apiResource を使うとcreate/editを除外できます。

Route::apiResource('items', ItemController::class);

名前付きルート

ルートに名前を付けると、URL変更時も呼び出し側を変えずに済み、保守性が向上します。

Route::get('/user/profile', [UserController::class, 'show'])->name('profile.show');

名前からURLを生成するには route() ヘルパーを使います。

// URLを生成
$url = route('profile.show');

// パラメーター付き
$url = route('items.show', ['item' => 42]);

// リダイレクト
return redirect()->route('profile.show');

Bladeテンプレート内でも同様に使えます。

<a href="{{ route('profile.show') }}">プロフィール</a>

ミドルウェアの適用

特定のルートに認証チェックやログ処理などを加えたい場合は ミドルウェア を使います。

// 単一ルートに適用
Route::get('/dashboard', [DashboardController::class, 'index'])
    ->middleware('auth');

// 複数のミドルウェアを適用
Route::get('/admin', [AdminController::class, 'index'])
    ->middleware(['auth', 'verified']);

複数ルートに同じミドルウェアを適用するなら Route::middleware() でグループ化するとすっきりします。

Route::middleware(['auth'])->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
    Route::get('/profile', [UserController::class, 'show']);
    Route::apiResource('items', ItemController::class);
});

ルート一覧の確認

定義したルートを確認するには Artisan コマンドが便利です。

# 全ルートを表示
php artisan route:list

# フィルタリングも可能
php artisan route:list --path=api/items

まとめ

この記事で学んだ内容を整理します。

  • Route::get / post などでHTTPメソッドに応じたルートを定義できる
  • コントローラーと紐付けることでロジックを整理できる
  • Route::resource / apiResource でRESTfulなルートを一括定義できる
  • 名前付きルートでURL変更に強いコードが書ける
  • ミドルウェアをルートやグループに適用して共通処理を集約できる

ルーティングはLaravelアプリの「入口」となる重要な部分です。しっかり理解して、読みやすく保守しやすいAPIを設計していきましょう。

← 記事一覧に戻る