Laravel のrouteに設定したパラメーターをバリデーションするには?

1 min read読了の目安(約1500字

こんにちは。

Laravel 6.xでの内容になります。

結論1.ルーティングにwhereメソッドを利用する。

// routes/web.php
Route::get('user/{id?}', 'UserContoroler@edit')->where('id', '[0-9]+');

結論2.RouteServiceProviderに条件を記載する。

// app/Providers/RouteServiceProvider.php

public function boot()
{
    Route::pattern('id', '[0-9]+');

    parent::boot();
}

通常のvalidation

通常、requestで与えられた内容をバリデーションするには、

  • Controllerに直書き
  • FormRequstを利用
    などの手段があると思います。

そして、通常はFormRequstを利用すると、スッキリして可読性も上がります。
※FormRequstについては割愛

routeに設定したパラメーターのバリデーションは?

さて、本題です。
例えば、以下のようなrouteがある場合を考えます。

// route.php
Route::get('user/{id}','UserContoroler@edit'); 

※基本的なルーティングも今回の記事の本題ではないのでざっくり記載。
この様に記載した場合、
hogehoge/user/1
にアクセスすれば、UserContorolerindexメソッドが処理されます。
さて、今回パラメータに記載した'user/{id}'
このidに対して、バリデーションはどの様に記載すれば良いでしょうか。

(1)whereメソッドを利用する。

Route::get('user/{id?}', 'UserContoroler@edit')->where('id', '[0-9]+');

1つ目の方法です。
この様にwhereメソッドをつなげて、中にチェックしたいパラメーター名正規表現パターンを記載します。
この記載の場合、id部分に数字だけを許可しています。
もし数字以外が来た場合は、通常404ページに飛ばされます。

その他、複数ある場合のイメージは以下のとおりです。

Route::get('user/{id}/{name}', 'UserContoroler@edit')->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

(2)RouteServiceProviderに条件を記載する。

2つ目の方法として、
RouteServiceProvider.phpのbootメソッドに制約条件を記載します。

// app/Providers/RouteServiceProvider.php

public function boot()
{
    Route::pattern('id', '[0-9]+');
    parent::boot();
}

この様にbootメソッドに記載すれば、
(上記の内容例だと)routeのパラメーター名にidがある場合に勝手に数字だけを許可しています。
もし数字以外が来た場合は、通常404ページに飛ばされます。

参考文献

https://laravel.com/docs/6.x/routing