ルーティングは、ユーザーがアクセスしたURLに対して「どの処理を実行するか」を定義する仕組みです。Laravelではroutes/web.phpファイルでルーティングを設定し、コントローラーのメソッドやクロージャーと紐付けます。この記事では、基本的なルート定義からパラメータの受け渡し、ルートグループまで実践的に解説します。
ルーティングの基本
Laravelのルーティングはroutes/web.phpに記述します。最もシンプルなルート定義は、URLとクロージャー(無名関数)の組み合わせです。
use Illuminate\Support\Facades\Route;
// クロージャーによるシンプルなルート
Route::get('/', function () {
return view('welcome');
});
// 文字列を返すルート
Route::get('/hello', function () {
return 'Hello, Laravel!';
});
Route::get()は HTTP GETリクエストに対するルートを定義します。第1引数にURLパス、第2引数に実行する処理(クロージャーまたはコントローラーのメソッド)を指定します。
クロージャーによるルート定義はテストやプロトタイプには便利ですが、実際のアプリケーションではコントローラーに処理を分離することが推奨されます。
HTTPメソッドの指定
LaravelではHTTPメソッド(GET、POST、PUT、DELETE等)に応じたルート定義が可能です。フォーム送信やAPI設計で使い分けます。
// GET: データの取得・表示
Route::get('/users', [UserController::class, 'index']);
// POST: データの新規作成
Route::post('/users', [UserController::class, 'store']);
// PUT/PATCH: データの更新
Route::put('/users/{id}', [UserController::class, 'update']);
// DELETE: データの削除
Route::delete('/users/{id}', [UserController::class, 'destroy']);
// 複数のHTTPメソッドに対応
Route::match(['get', 'post'], '/form', [FormController::class, 'handle']);
HTMLフォームは GET と POST しかサポートしていないため、PUT や DELETE を使う場合は@method('PUT')ディレクティブをフォーム内に追加する必要があります。
コントローラーとの紐付け
実際のアプリケーション開発では、処理をコントローラーに分離してルートから呼び出します。[コントローラークラス::class, 'メソッド名']の配列形式で指定します。
use App\Http\Controllers\EmployeeController;
// 一覧表示
Route::get('/employees', [EmployeeController::class, 'index']);
// 詳細表示
Route::get('/employees/{id}', [EmployeeController::class, 'show']);
// 新規作成フォーム表示
Route::get('/employees/create', [EmployeeController::class, 'create']);
// 新規作成処理
Route::post('/employees', [EmployeeController::class, 'store']);
上記のようなCRUD操作のルートを一括で定義するには、Route::resource()が便利です。
// 7つのCRUDルートを一括生成
Route::resource('employees', EmployeeController::class);
Route::resource()は index, create, store, show, edit, update, destroy の7つのルートを自動生成します。php artisan route:listコマンドで定義済みのルート一覧を確認できます。
ルートパラメータ
URLの一部を動的なパラメータとして受け取ることができます。波括弧{}で囲んだ部分がパラメータになります。
// 必須パラメータ
Route::get('/users/{id}', [UserController::class, 'show']);
// オプショナルパラメータ(?を付ける)
Route::get('/users/{name?}', function ($name = 'ゲスト') {
return "Hello, {$name}!";
});
// 正規表現による制約
Route::get('/users/{id}', [UserController::class, 'show'])
->where('id', '[0-9]+');
// 複数パラメータ
Route::get('/posts/{category}/{id}', [PostController::class, 'show'])
->where(['category' => '[a-z]+', 'id' => '[0-9]+']);
コントローラー側ではメソッドの引数としてパラメータを受け取ります。引数名はルート定義のパラメータ名と一致させます。
// UserController.php
public function show($id)
{
$user = User::findOrFail($id);
return view('users.show', compact('user'));
}
名前付きルートとルートグループ
ルートに名前を付けておくと、URLを変更してもアプリケーション内の参照箇所を修正する必要がなくなります。また、ルートグループを使えば、共通のプレフィックスやミドルウェアを一括で設定できます。
// 名前付きルート
Route::get('/dashboard', [DashboardController::class, 'index'])
->name('dashboard');
// Bladeテンプレートでの利用
// <a href="{{ route('dashboard') }}">ダッシュボード</a>
// ルートグループ(プレフィックス)
Route::prefix('admin')->group(function () {
Route::get('/users', [AdminUserController::class, 'index']); // /admin/users
Route::get('/settings', [AdminSettingController::class, 'index']); // /admin/settings
});
// ルートグループ(ミドルウェア)
Route::middleware('auth')->group(function () {
Route::get('/profile', [ProfileController::class, 'show']);
Route::get('/orders', [OrderController::class, 'index']);
});
middleware('auth')を指定すると、ログインしていないユーザーがアクセスした場合に自動でログインページへリダイレクトされます。認証が必要なページをまとめてグループ化すると便利です。
まとめ
- ルーティングは
routes/web.phpに記述し、URLと処理を紐付ける Route::get()、Route::post()等でHTTPメソッドごとにルートを定義する- コントローラーとの紐付けは
[Controller::class, 'method']形式で指定する Route::resource()でCRUDルートを一括生成できる- 波括弧
{}でURLパラメータを受け取り、where()で正規表現制約を付けられる - 名前付きルートとルートグループで保守性の高いルーティングを実現する