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

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を使っています。