ルートパラメータを制約するには?
Laravelは、ルート情報に where
メソッドをチェーンして、ルートパラメータに制約をかけることができます。
// 例1:
// 「name」パラメータはアルファベット大文字か小文字の1文字以上であること
Route::get('/user/{name}', [SampleController::class, 'name'])
->where('name', '[A-Za-z]+');
// 例2:
// 「id」パラメータは数字1文字以上であること
Route::get('/user/{id}', [SampleController::class, 'id'])
->where('id', '[0-9]+');
// 例3:
// 「id」は数字1文字以上かつ「name」はアルファベット小文字の1文字以上
Route::get('/user/{id}/{name}', [SampleController::class, 'id_name'])
->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
ルートパラメータが1つの場合は、where
メソッドの第1引数に「パラメータ名」を、第2引数に「制約の正規表現」を指定します。
ルートパラメータが、上記 例3
のように複数ある場合は、where
メソッドの引数を連想配列にして対応できます。
ルートパラメータ制約にヘルパメソッドを推したい理由
さて、このようにルートパラメータの制約をする際は where
メソッドを使用するだけでも十分に機能するのですが、この where
メソッドを使用しない「ヘルパメソッドを活用した制約」 があるのはご存知でしたか?
whereNumber メソッド
whereNumber
メソッドは、1文字以上の数字であること を制約とします。引数にルートパラメータ名を記入します。
Route::get('/user/{id}', [SampleController::class, 'id'])
->whereNumber('id');
whereAlpha メソッド
whereAlpha
メソッドは、アルファベットで大文字か小文字の1文字以上であること を制約とします。引数にルートパラメータ名を記入します。
Route::get('/user/{name}', [SampleController::class, 'name'])
->whereAlpha('name');
whereAlphaNumeric メソッド
whereAlphaNumeric
メソッドは、アルファベットの大文字もしくは小文字、または数字の1文字以上であること を制約とします。引数にルートパラメータ名を記入します。
Route::get('/post/{slug}', [SampleController::class, 'slug'])
->whereAlphaNumeric('slug');
このように、ヘルパメソッドを活用した制約をチェーンすることで、メソッド名自体が何の制約をするのかが想像できるような名前となっている ので、処理のイメージがより分かりやすくなります。
ぜひ、積極的に使用してみてはいかがでしょうか?(=゚ω゚)ノ
参考URL:
https://laravel.com/docs/9.x/routing
https://readouble.com/laravel/8.x/ja/routing.html