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,可以正常分页了。

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