Laravelのルーティングの基本的な書き方
いつもご利用ありがとうございます。
この記事には広告が掲載されており、その広告費によって運営しています。
Laravel のルーティングの基本的な書き方についてまとめました。
Laravel 7 以前は、こちらの記事を参照してください。
→ Laravel6 のルーティングの書き方。覚える基本系の1つを厳選
それ以降のバージョンは、当記事と同じです。
ルーティングを書く場所
/route/web.php
/route/api.php
などに書きます。
ルーティングの基本的な書き方
すべて書いてしまうパターン(非推奨)
Route::get('/user', function (Request $request) {
return $request->user();
})->middleware('auth:sanctum');
この書き方だとルーティングが増えたり、API の処理が複雑な際に、読みづらくなります。
ルーティングではリクエストをコントローラーへ処理を渡すように書きましょう。
ミニマムな書き方
use App\Http\Controllers\UserController;
Route::get('/user', [UserController::class, 'index']);
name をつける方法
Route::get('/posts', [PostController::class, 'index'])->name('post.index'); //nameをつける
name を付けると、名付けたものを route()というヘルパ関数から使えるようになります。
route('post.index')
使用例:
<a href={{ route('post.index') }}>ポスト一覧</a>
return redirect()->route('post.index');
name を付けるメリットは、URL の変更をする際に、ルーティングを変更するだけで良いということです。
パラメーターを付ける方法
Route::get('/user/{id}', [UserController::class, 'show'])->name('user.show');
{id}
このように波括弧で挟むことでパラメーターが入る前提のルーティングとなります。
また、パラメーターの条件を書くこともできます。
以下の例は、id は数字だけ入る時の書き方です。
Route::get('/user/{id}', [UserController::class, 'show'])->name('user.show')->where('id', '[0-9]+');
コントローラーでパラメーターを使うとき
引数に変数を書けば、何を書いても動きますが、ルーティングに書いたものを書くのが無難です。
public function show($id) //引数に書く。
{
dd($id); //パラメーターが使える
$user = User::find($id);
}
blade ファイルでリンクを書く時
<a href="{{ route('user.show', ['id' => 1]) }}">プロフィールを見る</a>
暗黙の結合
ようするに、パラメーターの ID と、Model の ID を照合して自動的にモデルインスタンスを取得してくれる仕組みがあります。
ルーティング側に書くパラメーターは何でも動きますが、モデル名と関連したパラメータにしておくのが無難です。
Route::get('/user/{user}', [UserController::class, 'show'])->name('user.show')->where('user', '[0-9]+');
public function show(User $user) //UserモデルのパラメータのIDと一致するUserモデルインスタンスを取得
{
dd($user); //`/user/1だと`IDが1のユーザー情報が取得されている。
}
これを知っておくと認可の時に役立ちます。
グルーピングする方法
ルーティングには、同じようなことを何度も書くことがあります。
例えば、認証ユーザーのみ使えるルーティング、非認証ユーザーのみ使えるルーティングなどがあります。
//認証ユーザーのみ
Route::middleware('auth:sanctum')->group(function () {
Route::get('user/{id}', [UserController::class,'show']);
});
このグループは、
- ミドルウェア
- コントローラ
- サブドメインルーティング
- ルートプレフィックス
- ルート名のプレフィックス
5つの軸でグルーピングすることが可能です。
そして、併用することが可能です。
Route::middleware('auth:sanctum')->group(function () {
Route::prefix('user')->group(function () {
Route::get('/{id}', [UserController::class,'show']);
});
});
メリット
しっかりと方針を立てて何をグルーピングするか決めることで格段にルーティングがみやすくなります。
Route::middleware('auth:sanctum')->group(function () {
Route::prefix('post')->group(function () {
Route::get('/', [PostController::class,'index']);
Route::get('/{id}', [PostController::class,'show']);
Route::post('/', [PostController::class,'store']);
Route::patch('/{id}', [PostController::class,'update']);
Route::delete('/{id}', [PostController::class,'destory']);
});
});
全く同じ処理ですが、グルーピングを使わない場合以下のようになります。
Route::prefix('post')->get('/', [PostController::class,'index'])->middleware('auth:sanctum');
Route::prefix('post')->get('/{id}', [PostController::class,'show'])->middleware('auth:sanctum');
Route::prefix('post')->post('/', [PostController::class,'store'])->middleware('auth:sanctum');
Route::prefix('post')->patch('/{id}', [PostController::class,'update'])->middleware('auth:sanctum');
Route::prefix('post')->delete('/{id}', [PostController::class,'destory'])->middleware('auth:sanctum');
グルーピングした方が見やすいパターンもあるし、見辛くすることもあるので方針作りが大切だとは思います。
まとめ
色々な書き方ありますが、よく使うものだけピックアップしました。
すべて知りたいという方は、以下のサイトに書いてありますので見てみてください。