こんにちは、かつコーチです。
Laravelを扱う上で、Routingの理解は必須となります。
今回はそのRoutingについて解説します。
Laravelの**ルーティング(Routing)**は、ユーザーからのリクエストを
適切なコントローラーや処理に結びつけるための重要な役割を果たします。
Laravelのルート定義は非常にシンプルかつ柔軟で、
基本的なCRUD操作や複雑なルーティングパターンも直感的に設定できます。
基本的なルーティング
シンプルなルート
Laravelでは、routes/web.php
にルートを定義します。
最も基本的なルートは、HTTPメソッドとURL、
そしてそれに対応するクロージャ(匿名関数)またはコントローラーアクションを指定します。
Route::get('/welcome', function () {
return view('welcome');
});
この例では、/welcome
というURLに対してGET
リクエストが送られると、resources/views/welcome.blade.php
が表示されます。
HTTPメソッド
Laravelのルートは、以下のHTTPメソッドに対応します:
- GET: データの取得
- POST: データの送信・保存
- PUT/PATCH: データの更新
- DELETE: データの削除
それぞれのメソッドに対応するルートの例は次の通りです:
Route::get('/users', function () {
return 'Display user list';
});
Route::post('/users', function () {
return 'Create new user';
});
Route::put('/users/{id}', function ($id) {
return 'Update user with ID ' . $id;
});
Route::delete('/users/{id}', function ($id) {
return 'Delete user with ID ' . $id;
});
Route Parameters(ルートパラメータ)
ルートにパラメータを含めることで、ダイナミックに動的なURLを処理できます。
Route::get('/users/{id}', function ($id) {
return 'User ID is ' . $id;
});
{id}
はパラメータとして扱われ、リクエストの際にこの値がクロージャに渡されます。
任意パラメータ
?
を付けることで、パラメータを任意にできます。デフォルト値を設定することも可能です。
Route::get('/users/{name?}', function ($name = 'Guest') {
return 'Hello, ' . $name;
});
コントローラーの利用
基本的なコントローラールート
ルートにクロージャを直接記述する代わりに、
コントローラーを使用して処理を分離・整理することができます。
Route::get('/users', [UserController::class, 'index']);
この例では、UserController
のindex
メソッドが呼び出されます。
RESTfulリソースコントローラー
Laravelでは、CRUD操作のためのルートを自動的に生成するリソースコントローラーが提供されています。
Route::resource('posts', PostController::class);
これにより、以下のルートが自動生成されます:
HTTP メソッド | URL | アクション | コントローラー メソッド |
---|---|---|---|
GET | /posts | 全件表示 | index |
GET | /posts/create | 新規作成フォーム | create |
POST | /posts | 新規作成処理 | store |
GET | /posts/{id} | 個別表示 | show |
GET | /posts/{id}/edit | 編集フォーム | edit |
PUT/PATCH | /posts/{id} | 更新処理 | update |
DELETE | /posts/{id} | 削除処理 | destroy |
特定のアクションだけを登録する
すべてのアクションではなく、特定のアクションだけを登録したい場合はonly
やexcept
を使います。
Route::resource('posts', PostController::class)->only(['index', 'show']);
Route::resource('posts', PostController::class)->except(['destroy']);
名前付きルート
ルートに名前を付ける
ルートに名前を付けると、そのルートに対応するURLを簡単に参照できます。
名前付きルートはURLの生成やリダイレクト時に便利です。
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
ビューやコントローラーで名前付きルートを参照できます:
<a href="{{ route('dashboard') }}">Dashboard</a>
リダイレクトする際も名前付きルートを使用できます:
return redirect()->route('dashboard');
ルートグループ
ルートグループを使用すると、共通のURLプレフィックスやミドルウェアを複数のルートに適用できます。
URLプレフィックス
グループ内のルートに共通のプレフィックスを追加することができます。
Route::prefix('admin')->group(function () {
Route::get('/users', function () {
return 'Admin User List';
});
Route::get('/posts', function () {
return 'Admin Post List';
});
});
この例では、/admin/users
や/admin/posts
のようなURLが定義されます。
ミドルウェア
グループに共通のミドルウェアを適用することができます。
Route::middleware(['auth'])->group(function () {
Route::get('/profile', function () {
// 認証されたユーザーのみがアクセス可能
});
Route::get('/settings', function () {
// 認証されたユーザーのみがアクセス可能
});
});
ルートのミドルウェア
ミドルウェアは、ルートにアクセスする前にリクエストをフィルタリングする仕組みです。
Laravelにはいくつかのデフォルトミドルウェアが用意されていますが、
独自にカスタムミドルウェアを作成してルートに適用することも可能です。
ルートにミドルウェアを適用する
Route::get('/dashboard', [DashboardController::class, 'index'])->middleware('auth');
ここでauth
ミドルウェアが適用され、認証されていないユーザーはリダイレクトされます。
ルートのパラメータバリデーション
正規表現によるパラメータ制約
ルートパラメータに正規表現を使って制約をかけることができます。
Route::get('/users/{id}', function ($id) {
return 'User ID is ' . $id;
})->where('id', '[0-9]+');
この例では、id
パラメータが数値である場合のみルートがマッチします。
グローバルなパラメータ制約
すべてのルートパラメータに対して共通の制約を設定することも可能です。
これはRouteServiceProvider
で設定します。
public function boot()
{
Route::pattern('id', '[0-9]+');
}
ルートパラメータの依存性注入
ルートパラメータにモデルを自動的に注入する機能をルートモデルバインディングと呼びます。
ルートモデルバインディング
例えば、/users/{user}
というURLが指定された場合、{user}
の部分にUser
モデルを自動的に解決できます。
Route::get('/users/{user}', function (App\Models\User $user) {
return $user->name;
});
この例では、{user}
の部分がUser
モデルのインスタンスとしてコントローラーやクロージャに渡されます。
APIルーティング
Laravelでは、routes/api.php
ファイルにAPI専用のルートを定義できます。
api.php
のルートはステートレスで、api
ミドルウェアグループが自動的に適用されます。
Route::get('/users', function () {
return App\Models\User::all();
});
APIルートは、通常のセッションや認証クッキーを使わず、
トークンベースの認証やJSONレスポンスを想定しています。
まとめ
Laravelのルーティングは非常に強力で柔軟です。
シンプルなルート定義から複雑なリソースコントローラー、ミドルウェアや名前付きルート、
さらにはAPIルーティングまで、多様なシステムに対応することができます。
これにより、開発者は効率的かつ簡潔なコードで、
複雑なアプリケーションを構築することが可能です。