場景
最近在爲一個老平臺做APP開發,後臺系統使用的是 TP5.0
,在寫一個數據統計模塊的 API
,需要用到分頁函數,傳參時個人喜歡用 POST
方法,結果 Paginate
方法卻只能獲取第1頁的數據,而前端傳過去的 page
值是正常的。
說實在的 GET
真的不太優雅,所以很不喜歡這種用法,那就只能刨根問題去找問題了。
分析
因爲我傳到服務器的數據是沒有問題的,測試API發現,更換成 GET
卻可以正確分頁,而 POST
只能獲取第1頁數據。
看來問題出在 Paginate
裏面,這應該是 TP5.0
框架的 bug
,Paginate
是個類,路徑是 thinkphp/library/think/Paginator.php
。
繼續排查 Paginate
,問題是出在下面 自動獲取當前頁碼
這個函數:
/**
* 自動獲取當前頁碼
* @param string $varPage
* @param int $default
* @return int
*/
public static function getCurrentPage($varPage = 'page', $default = 1) {
$page = Request::instance()->request($varPage);
if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) {
return $page;
}
return $default;
}
這裏面 $page = Request::instance()->request($varPage);
並不能正確獲取 page
的值, 主要的問題出在 Request::instance()->request
, request()
方法默認只能取到 GET
方法的參數,卻無法獲取 POST
的數據,這便是問題的根源。
我想應該是平臺開發時,這個 BUG
還沒有來得及修復,當時開發人員也懶得去修復,所以後臺的 API
全都使用了 GET
方法。
解決
找到問題事情就好解決了,我們知道 TP5.0
中助手函數 input()
是能正常獲取到 GET
和 POST
數據的,所以只需要修改取值方法這段即可,也就是把:
$page = Request::instance()->request($varPage);
改爲:
$page = input($varPage);
保存上傳到服務器,OK,可以正常分頁了。