0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravel8 URLがディレクトリまで同じでも、ファイル名で処理を振り分けたい!

Last updated at Posted at 2021-11-03

##はじめに
Laravel8でディレクトリまでが同じURLでも、ファイル名(数値or文字列)次第でコントローラーを振り分ける必要が出て、少し焦ったので備忘録を書きました。

##やりたいこと

.php
 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}側に処理が渡ってしまっていること。

##対策

正規表現を使って数字以外を弾いて、①の処理をスルーさせる。

.php
 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の設計に問題があるとか、そういった話は一旦無しでお願いします..笑

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?