🦑
Laravel のrouteに設定したパラメーターをバリデーションするには?
こんにちは。
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
にアクセスすれば、UserContoroler
のindex
メソッドが処理されます。
さて、今回パラメータに記載した'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ページ
に飛ばされます。
参考文献
Discussion