Route に条件追加

こんにちは、しましまです。

今回は、案件で 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 について新しいことを学べて楽しいです。
基本的な機能だと思いますが、触れるほど便利な機能があり、快適にコーディングできるようになっているのがわかります。
また学ぶことがあったらブログとしてまとめたいと思います。