Laravel 8分页点击页面返回整数报错问题排查
Laravel 8分页自定义参数后返回整数报错的原因
问题场景
在Laravel 8中实现表格分页功能时,自定义分页参数名称后,点击下一页出现错误:Invalid Foreach / Call to a member function links() on int。调试发现点击分页后返回值为整数(如点击第2页返回1)。为实现动态化,修改了框架核心Builder文件中paginate方法的$pageName默认值为null,相关代码如下:
修改后的Builder代码
// 原始代码 public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) // 修改后代码 public function paginate($perPage = null, $columns = ['*'], $pageName = null, $page = null)
Controller中的分页调用代码
$sales = Sale::where('company_id', Auth::user()->company_id) ->whereBetween('date_delivered', [$this->start_date, $this->end_date]) ->where('level_id',4) ->search(trim($this->search)) ->orderBy($this->column, $this->order) ->paginate($this->size,['*'],'sales');
原因分析
核心文件修改破坏框架逻辑:Laravel的
Builder::paginate方法默认$pageName参数为'page',这个参数用于框架内部识别请求中的分页参数、生成分页链接。你将默认值改为null后,框架在处理分页时无法正确解析当前页码、构建分页实例,最终导致paginate方法没有返回预期的LengthAwarePaginator对象,而是意外返回了整数(大概率是查询结果的计数)。自定义分页参数无需修改核心文件:Laravel原生就支持在调用
paginate时传入自定义$pageName,你Controller中的写法->paginate($this->size, ['*'], 'sales')本身是完全正确的,根本不需要修改框架核心代码。修改核心文件不仅没必要,还会引发兼容性问题,后续框架升级时你的修改会被覆盖,同时导致内部逻辑混乱。
解决方法
- 立即恢复
Builder文件中paginate方法的原始代码,不要修改任何Laravel核心文件。 - 保持Controller中的分页调用代码不变,Laravel会自动识别你传入的
sales作为分页参数名,正常生成分页链接并处理分页请求。
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

