はじめに
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 | /items | index |
| GET | /items/create | create |
| POST | /items | store |
| GET | /items/ | show |
| GET | /items//edit | edit |
| 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を設計していきましょう。