Laravelでweb.phpの動的なルート情報をカスタムする方法

8 回閲覧されました
みなさんこんにちは、jonioです。
Laravelでweb.phpに下記の記述をしたとします。
Route::get('/root1/{variable}/root2', [DemoController::class, 'demoAction']);
この書き方をすると例えば「root1/1/root2」みたいなURLを指定することになりますが「1」の後ろに動的なパスが入る場合があります。
例えば「root1/1/root2/私」・「root1/1/root2/あなた」・「root1/1/root2/彼」とか。(私・あなた・彼の部分が動的に変わります)
私・あなた・彼の部分に対応できるルート設定を書くのは無限にパターンがあってキリがないです。
こんな場合に全てのルートに対応できる方法があるのでメモとしてこの記事を残します。
Laravelの無料学習サイトを作りました
Laravelを勉強したい人向けの無料の学習サイトを作りました。
ここからリンクに飛べますのでぜひ利用してください。
whereを使う
「root2」以降を動的な値に変えたいとします。
下記の記述をします。
Route::get('/root1/{variable}/root2', [DemoController::class, 'demoAction'])->where('root2', '.*');
「->where(‘root2’, ‘.*’)」を追記しています。
この書き方をすると「root2以降は何が入ってもいい」という意味になります。
「.*」の「.」は「/を含む任意の文字」という意味で「*」は「0回以上繰り返される」という意味です。
だから「.*」は「任意の文字が0回以上繰り返される」という意味になります。
疑問点
「->where(‘root2’, ‘.*’)」が「root2以降は何が入ってもいい」という意味なら記述を下記にしたいと思いませんか?
Route::get('/root1/{variable}/root2', [DemoController::class, 'demoAction'])->where('root1', '.*');
この記述だと「variable」と「私・あなた・彼」の2ヶ所の変数があるので対応ができません。
whereは1つの変数にしか対応できないのでroot2以降にwhereを使っています。