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去繞過這樣的限制)