Layui 的 table 和 laypage 对 PHP 后端返回的 JSON 数据格式要求非常严格,标准响应字段必须是 code、msg、count、data 这 4 个:其中 code 必须等于 0,msg 不能为空,也不能是 null,count 必须返回总记录数(使用 total()),data 则必须是纯数组(使用 items());此外,URL 参数名也必须与 input('page')、input('limit') 保持一致;还有一个经常被忽视的细节,PHP 文件必须保存为 UTF-8 且不能带 BOM。

Layui 分页对接 PHP 后端其实可以直接使用,关键不在于“能不能接”,而在于后端输出的 JSON 结构是否严格符合 laypage 或 table 的预期字段。只要结构不匹配,就很容易出现翻页后数据为空、总数显示为 0、页码无法正常跳转等问题——这些现象本质上几乎都是返回结构错误导致的。
后端必须返回这四个字段:code、msg、count、data
Layui 的 table 和 laypage 只识别这一套固定 JSON 结构,其他字段名(例如 current_page、last_page、per_page)前端默认不会解析。ThinkPHP 默认通过 $list->toArray() 或 $list->render() 返回的通常是包含分页元信息的对象数组,直接传给前端往往会缺少 count,从而导致分页功能失效。
code:必须是0,表示请求成功;如果不是 0,Layui 会按错误结果处理,table不会渲染datamsg:可以是空字符串,但不能省略,更不能是null(在 PHP 中json_encode(null)会变成null,部分场景下前端解析会出问题)count:必须返回总记录数,正确写法是$list->total(),而不是count($list->items())(后者只是当前页的数据条数)data:必须是纯数组,建议使用$list->items();不要直接用$list->all(),因为它可能附带分页元数据,影响 Layui 表格渲染
URL 参数名要和 PHP input() 取值一致
前端请求时传递的参数名,必须和后端通过 input('page')、input('limit') 获取的字段一致,否则分页时计算偏移量就会出错。Layui 默认分页参数就是 page 和 limit,如果前端自定义修改了参数名,PHP 后端也必须同步调整。
- table 异步加载:URL 可写成
url: '/user/list?page={{page}}&limit={{limit}}',这里的双大括号是 Layui 模板语法,请求发送时会自动替换成实际页码和条数 - laypage 手动跳转:可以在
jump回调中拼接 URL,例如window.location.href = '/user/list?page=' + obj.curr + '&limit=' + obj.limit - ThinkPHP 中建议使用
input('page', 1, 'intval')和input('limit', 10, 'intval')获取参数,既能避免类型错误,也能降低注入风险
ThinkPHP 分页构造示例(TP5.1+)
不要为了省事把它封装成通用返回方法后直接复用,因为 paginate() 返回对象的字段名与 Layui 需要的 JSON 字段名并不一致,中间必须手动做一次字段映射,才能正确实现 Layui 分页和异步加载。
php
// controller 方法
public function list()
{
$page = input('page', 1, 'intval');
$limit = input('limit', 10, 'intval');
$list = Db::name('user')->paginate($limit, false, ['page' => $page]);
// 必须手动构造
return json([
'code'=> 0,
'msg' => '',
'count' => $list->total(), // 总数
'data'=> $list->items(), // 当前页数据,纯数组
]);
}
注意:这里不需要额外返回 curr 或 pages 之类的字段,因为 table 和 laypage 会根据 count 与 limit 自动计算总页数和当前分页状态,后端只需要保证总记录数准确即可。
容易被忽略的坑:JSON 中的 null 和中文编码
在 PHP 中,json_encode() 默认会把中文转换成 Unicode 形式,例如 u4f60u597d。Layui 大多数情况下依然可以正常显示,但在调试 PHP 分页接口或排查 JSON 返回问题时,这种格式可读性较差,不够直观。真正更需要重点关注的是字段值为 null 的情况——例如 msg => null,JSON 编码后会变成 "msg":null。在部分旧版 Layui 中,这类响应甚至可能直接导致解析失败,最终表现为整段接口返回被前端忽略。
- 统一使用空字符串:
'msg' => '',不要使用null,也不要随意换成其他假值 - 确保 PHP 文件编码为 UTF-8 无 BOM,否则 JSON 前面可能夹带不可见字符,导致
JSON.parse直接报错 - 用浏览器开发者工具查看 Network → Response,确认接口返回的是纯净 JSON,没有 HTML 包裹,也没有 PHP Warning、Notice 等输出混入响应内容中
