##はじめに
Laravel8でディレクトリまでが同じURLでも、ファイル名(数値or文字列)次第でコントローラーを振り分ける
必要が出て、少し焦ったので備忘録を書きました。
##やりたいこと
① Route::get('/team/{member_id}', [MemberController::class, 'index']);
② Route::get('/team/{country}', [CountryController::class, 'index']);
①の{member_id}には数値
を
②の{country}には文字列
を渡して、
それぞれのコントローラーまで処理を通したい。
※それぞれのコントローラーでバリデーションされ、①は数値のみ、②は文字列でしかパラメーターを受け取らない前提。
##問題
(ドメイン名はhoge.comとして)
① https://hoge.com/team/1
② https://hoge.com/team/japan
それぞれのルーティングの処理に上記のようなリクエストをした場合、
①はコントローラーまで通るが②は通らない。
原因は/team/japan
と文字列のパスを指定しても
②の{country}側にルーティングをする前に、
①の{member_id}側に処理が渡ってしまっていること。
##対策
正規表現を使って数字以外を弾いて、①の処理をスルーさせる。
① Route::get('/team/{member_id}', [MemberController::class, 'index'])
->where('member_id', '[0-9]+');
② Route::get('/team/{country}', [CountryController::class, 'index'])
->where('country', '[a-zA-Z]+');
*②の->where('country', '[a-zA-Z]+');
は書かなくても大丈夫。
##終わりに
URLを先に決めて処理を書いていたので、
気づいた時には焦りましたが簡単に対策が打てました。
URLの設計に問題があるとか、そういった話は一旦無しでお願いします..笑