tp6是一個封裝度很高的框架,在大部分場景下都能作到開箱即用數組
本次遇到狀況爲,當請求消息體爲索引數組時,路由參數沒法正常獲取框架
路由定義post
Route::post('test/:a/:b', 'index/test');
Index控制器輸出參數測試
public function test($a, $b) { dump($a, $b); }
請求測試,以下圖咱們獲得了咱們所須要的結果this
將IndexController->test中`$a, $b`參數調換位置(路由不變)spa
public function test($b, $a) { dump($a, $b); }
從新請求,獲得的結果依然不變3d
那麼咱們是否能夠獲得結論:tp6控制器參數會根據路由參數名自動匹配?code
看以上結果好像是沒問題,可是有個大坑!blog
路由,控制器輸出方法都不變,僅增長requestBody,獲得以下結果索引
說好的路由匹配呢!
在方法中打印出`request->param()`可查看到剛纔的請求最終獲得的參數
array:4 [ 0 => 3 1 => 4 "a" => "1" "b" => "2" ]
能夠看到消息體中參數是索引數組部分,而路由參數a,b爲關聯數組部分
tp在最終匹配action參數的時候,按照先分配索引,再分配關聯的順序進行了參數傳入,致使沒有獲得咱們想要的效果
若消息體內增長鍵值,咱們從新嘗試,以下圖依然是咱們想要的結果
因此大概獲得結論:param()參數的來源爲先獲取query、body等參數,再覆蓋上路由參數
既然已經知道緣由,那麼解決方案就比較好處理了
更改消息體,避免直接使用索引數組傳遞,如
咱們在方法內根據鍵值data便可獲取想要的數據
不須要更改結構體,但action參數不經過傳入參數獲取,由內部本身獲取
// action代碼以下 public function test() { $a = $this->request->param('a'); $b = $this->request->param('b'); dump($a, $b); dump($this->request->param()); }
使用原消息體測試
根據結果,不能說這是tp的BUG,能夠說此次問題是不熟悉致使,但也算是一個坑吧,在遇到這種狀況下確實容易摸不着頭腦
你們項目內使用時多多注意便可~