ThinkPHP不会自动补缺失请求参数,默认值需在验证前用array_merge($defaults, $this->request->param())手动合并;validate的default规则仅临时用于校验,不修改原始数组结构。

ThinkPHP 不会自动给缺失的请求参数补默认值,$request->param() 返回的就是原始数据,缺啥就是缺啥。必须手动补,而且得在验证之前做。
为什么 validate 的 default 规则不管用
验证规则里写 'status|状态' => 'require|default:1',只在验证时临时用这个值判断是否通过,不会往原始数组里写入 status 这个键。后续代码如果写了 isset($data['status']) 或用 extract($data),照样报 Notice 或跳逻辑。
-
default不改变数组结构,只影响验证过程中的临时$data - 前端传了
{"name": "a"},$data里还是没有status键 - 模型层的
$default属性也一样,只对「完全没传」或null生效,不补结构
正确做法:用 array_merge 补结构
在控制器里,接收参数后、调用 validate() 前,用 array_merge() 和预设默认值合并。注意不是 array_replace(),后者会把 null 覆盖掉,而 array_merge() 只补 key 不存在的情况,更符合“补缺”本意。
- 定义默认结构:
$defaults = ['status' => 1, 'is_hot' => 0, 'limit' => 10]; - 合并:
$data = array_merge($defaults, $this->request->param()); - 再验证:
$this->validate($data, 'User.edit'); - 别用
input()直接合并,它可能带类型转换或前缀;优先用param()拿原始数组
分页参数名改了,page 还是读不到?
想把分页参数从 page 改成 pn,光改配置项 var_page 没用。分页器内部初始化时硬编码调用了 input('page'),必须重写 getCurrentPage() 方法。
立即学习“PHP免费学习笔记(深入)”;
- 新建类继承原驱动,比如
app\common\paginator\CustomBootstrap - 重写
getCurrentPage(),改成读input('pn/d', 1) - 调用
paginate()时显式指定'type'和'var_page'两个配置项 - 漏掉任意一个,就会出现链接跳转是
?pn=2,但后端仍按page=2解析的错位
最易被忽略的是:所有“补默认值”的动作,都得发生在验证和模型操作之前。一旦进了 validate() 或 save(),原始结构就固定了,再补也没意义。



















