Laravel 5.5控制器返回分页links()为空的问题排查
问题原因及解决方案
首先说下为什么会出现这个情况:
当你调用$models->links()时,它返回的是一个**HtmlString对象**,这个对象封装了分页链接的HTML内容。但当你把这个对象直接放到response()->json()里进行JSON序列化时,PHP的json_encode函数只会序列化对象的公共属性,而HtmlString的内容是存在受保护的$content属性里的,所以最终被序列化成了空值。
而当你直接return $models->links()时,Laravel会自动触发对象的__toString()方法,把HtmlString转换成对应的HTML字符串输出,所以能得到预期的分页链接。
解决办法
方法1:手动转换为字符串
直接调用HtmlString对象的__toString()方法,把它转换成字符串后再放入JSON响应:
$models= Model::with('table2', 'table3')->simplePaginate(5); $str= ""; foreach($models as $model){ // 这里注意要加$符号,你原来的代码漏了 $str .= $model['name']; // 或者$model->name,取决于你的模型设置 } return response()->json([ 'rows' => $str, 'links' => $models->links()->__toString() ], 200);
方法2:使用render()方法
links()内部其实是调用了render()方法来生成HTML,你也可以直接用render(),它同样会返回HtmlString,所以也要转成字符串:
return response()->json([ 'rows' => $str, 'links' => $models->render()->__toString() ], 200);
方法3:返回结构化分页数据(推荐)
如果你的前端需要自己渲染分页组件(而不是直接用HTML),可以获取分页器的结构化数据,这样更灵活:
$models= Model::with('table2', 'table3')->simplePaginate(5); $str= ""; foreach($models as $model){ $str .= $model['name']; } // 获取分页的结构化数组 $pagination = $models->toArray(); return response()->json([ 'rows' => $str, 'pagination' => [ 'current_page' => $pagination['current_page'], 'per_page' => $pagination['per_page'], 'next_page_url' => $pagination['next_page_url'], 'prev_page_url' => $pagination['prev_page_url'], 'from' => $pagination['from'], 'to' => $pagination['to'] ] ], 200);
另外提个小细节:你原来的循环代码里foreach($models as model)少了$符号,应该是foreach($models as $model),不然会报错哦~
内容的提问来源于stack exchange,提问作者KordDEM
相关产品推荐
相关产品推荐

