こんにちは、しましまです。
今回は、案件で Laravel のルーティングを修正する際に学んだことをまとめます。

既存のルーティング
既存の仕様は以下のようになっていました。
- /user/ でユーザーの一覧を表示する
- /user/{id} でユーザーの id に紐づく詳細画面を表示する(例:/user/1 ⇒ id:1 のユーザーの詳細画面表示)
use App\Http\Controllers\UserController;
use App\Http\Controllers\CommonController;
Route::prefix('user')->group(function () {
Route::get('/', [UserController::class, 'index']);
Route::get('{id}', [UserController::class, 'detail']);
});
// 静的ページ表示用の共通処理
Route::fallback(CommonController::class);
追加要件
そして今回追加要件として、ユーザー関連の画面を /user 配下に追加したいという要望がありました。
- /user/ の配下に静的な画面を追加する
- 今後も/user/のは以下に画面追加する可能性がある
既存のコードのままだと静的ページを追加した場合、Route::get('{id}', [UserController::class, 'detail']);
が拾ってしまい、PHPエラーが発生してしまいました。
そこで、拾う id に以下のように条件を追加し、数値のみを受け付けるよう修正することで、末尾の静的ページの共通処理を通すことができます。
use App\Http\Controllers\UserController;
use App\Http\Controllers\CommonController;
Route::prefix('user')->group(function () {
Route::get('/', [UserController::class, 'index']);
// id に条件を追加(数値のみ受付)
Route::get('{id}', [UserController::class, 'detail'])->where('id', '[0-9]+');
});
Route::fallback(CommonController::class);
上記は正規表現ですが、数値のみを受け付けるように修正するのであれば
Route::get('{id}', [UserController::class, 'detail'])->whereNumber('id')
のようによく使用されるであろう条件はLaravel 側が用意しており、より簡潔にコードを記述することができます。
おわりに
Laravel について新しいことを学べて楽しいです。
基本的な機能だと思いますが、触れるほど便利な機能があり、快適にコーディングできるようになっているのがわかります。
また学ぶことがあったらブログとしてまとめたいと思います。