tp6 路由匹配參數獲取問題

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等參數,再覆蓋上路由參數

 

解決方案

既然已經知道緣由,那麼解決方案就比較好處理了

方案1

更改消息體,避免直接使用索引數組傳遞,如

 咱們在方法內根據鍵值data便可獲取想要的數據

方案2

不須要更改結構體,但action參數不經過傳入參數獲取,由內部本身獲取

// action代碼以下
public function test()
{
    $a = $this->request->param('a');
    $b = $this->request->param('b');
    dump($a, $b);
    dump($this->request->param());
}

使用原消息體測試

 

總結

根據結果,不能說這是tp的BUG,能夠說此次問題是不熟悉致使,但也算是一個坑吧,在遇到這種狀況下確實容易摸不着頭腦

你們項目內使用時多多注意便可~

相關文章
相關標籤/搜索