Last updated on
Laravel 7 路由(Route) 獲取參數隱憂
大概是上個月初(2022/11)發現了此問題
簡單描述一下, Laravel 7的Route幾乎和其他版本沒啥太大的不同, 你可能有這樣的配置:
Route::match([‘get’, ‘post’], ‘{eventId}/ranking’, ‘EventRankingController@OnEventRanking’);
在 EventRankingController@OnEventRanking 當中, 你可以這樣做去獲取參數:
public function EventRanking(Request $request, string $eventId) {}
目前為止, 它看起來工作正常對吧?
今天我們增加了一個參數 “lang”, 它能控制頁面的 i18n 語系以及後臺數據的取得控制
在View我也想獲取lang的參數輸出特別的內容
那我該怎麼做呢?
網路上一貫做法是:
request()->lang
事實上: 是的 它確實工作
那麼問題點在哪?
假設今天我們的路由這樣配置:
Route::get(‘{lang}/get_event_mst’, ‘EventController@OnGetMst’);
當我們獲取 /ja_jp/get_event_mst 它看起來一切正常 對吧?
那麼我們稍微改一下網址: /ja_jp/get_event_mst?lang=zh_tw
一切都將變得不一樣…
它將優先檢查Query string而不是路由的參數!!
最好的做法應為:
request->route(“lang”)
真的是細節中的魔鬼, 幸好目前為止都沒讓客戶發現這個問題
依據設計, 可能會讓客戶繞過一些限制(例如僅允許取得ja_jp的資料, 但透過Query去繞過這樣的限制)