ThinkPHP5.0內置分頁函數Paginate無法獲取POST頁數問題的解決辦法

場景

最近在爲一個老平臺做APP開發,後臺系統使用的是 TP5.0,在寫一個數據統計模塊的 API,需要用到分頁函數,傳參時個人喜歡用 POST 方法,結果 Paginate 方法卻只能獲取第1頁的數據,而前端傳過去的 page 值是正常的。

說實在的 GET 真的不太優雅,所以很不喜歡這種用法,那就只能刨根問題去找問題了。

分析

因爲我傳到服務器的數據是沒有問題的,測試API發現,更換成 GET 卻可以正確分頁,而 POST 只能獲取第1頁數據。

看來問題出在 Paginate 裏面,這應該是 TP5.0 框架的 bugPaginate 是個類,路徑是 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()->requestrequest() 方法默認只能取到 GET 方法的參數,卻無法獲取 POST 的數據,這便是問題的根源。

我想應該是平臺開發時,這個 BUG 還沒有來得及修復,當時開發人員也懶得去修復,所以後臺的 API 全都使用了 GET 方法。

解決

找到問題事情就好解決了,我們知道 TP5.0 中助手函數 input() 是能正常獲取到 GETPOST 數據的,所以只需要修改取值方法這段即可,也就是把:

$page = Request::instance()->request($varPage);

改爲:

$page = input($varPage);

保存上傳到服務器,OK,可以正常分頁了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章