Laravel 10自定义分页报错:Call to a member function links() on array
解决Laravel 10自定义分页中“Call to a member function links() on array”错误
问题根源
前端控制器CulinaryController.php通过HTTP请求获取API返回的分页数据后,使用json_decode(..., true)将响应转为关联数组,但Blade视图中$data->links()需要的是Laravel的LengthAwarePaginator实例,数组不存在links()方法,因此触发报错。
解决方案
方案1:将API返回的JSON数据重新封装为分页实例
修改CulinaryController.php的index方法,把API返回的JSON结构转为LengthAwarePaginator对象:
public function index(Request $request) { $client = new Client(); $qs = http_build_query($request->query()); $qs = $qs ? '?'.$qs : ''; $url = initURLPath("culinary" . $qs); $response = $client->get($url); // 取消第二个参数true,将JSON转为对象而非数组 $json = json_decode((string)$response->getBody()->getContents()); if ($request->query('dd')) { dd($json); } // 用API返回的分页字段构建Laravel分页实例 $paginator = new \Illuminate\Pagination\LengthAwarePaginator( $json->data, // 分页后的数据集 $json->total, // 总记录数 $json->per_page, // 每页条数 $json->current_page, // 当前页码 [ 'path' => \Illuminate\Pagination\LengthAwarePaginator::resolveCurrentPath(), 'query' => $request->query(), ] ); $view_data = [ 'title' => 'Browse Culinary', 'data' => $paginator, ]; return view('culinary.index', $view_data); }
Laravel的LengthAwarePaginator返回的JSON默认包含data/total/per_page/current_page等字段,直接用这些字段重构实例即可让$data具备links()方法。
方案2:同项目内直接复用分页逻辑(推荐)
如果API和前端控制器属于同一个Laravel项目,无需走HTTP请求,直接在前端控制器处理分页:
public function index(Request $request) { $perPage = $request->query('per_page', 8); $currentPage = $request->query('page', 1); // 直接用模型的paginate方法生成分页实例 $paginator = \App\Models\Culinary::paginate($perPage, ['*'], 'page', $currentPage); // 保留URL中的其他查询参数 $paginator->appends($request->query()); $view_data = [ 'title' => 'Browse Culinary', 'data' => $paginator, ]; return view('culinary.index', $view_data); }
该方式省去了HTTP请求和JSON转码的环节,代码更简洁,彻底避免类型不匹配问题。
内容的提问来源于stack exchange,提问作者dapidmini
相关产品推荐
相关产品推荐

