CodeIgniter 4 表单验证改为显式调用模式,需在控制器中使用 $this->validate() 或 Validation 服务,模型 $validationRules 不自动触发,callback 规则被废弃,错误提示与表单回填需手动处理。

CodeIgniter 3 升级到 4 后,表单验证机制发生了根本性变化:不再是“配置即生效”的被动模式,而是变成“显式调用、按需执行”的主动模式。很多开发者发现升级后 $this->form_validation->run() 不起作用、$model->errors() 始终为空——这通常不是规则写错了,而是验证流程没走对。
验证入口从 form_validation 类移到控制器方法
CI3 中靠 $this->form_validation 实例统一管理;CI4 中已移除该类,验证逻辑收归控制器层,由 $this->validate() 辅助函数或 Validation 服务驱动。
- CI3 写法(不再有效):
$this->form_validation->set_rules('email', '邮箱', 'required|valid_email');<br>if ($this->form_validation->run() === FALSE) { ... } - CI4 正确写法:
$rules = ['email' => 'required|valid_email'];<br>if (!$this->validate($rules)) {<br> // 失败时获取错误:<br> $errors = $this->validator->getErrors();<br>} - 若需自定义错误消息,传入第三个参数(关联数组),结构与 CI3 的
errors键一致
模型中的 $validationRules 不再自动触发
CI4 模型里定义的 $validationRules 仅是规则容器,不参与运行时校验。它不会在 save() 或 insert() 时自动生效。
- 必须在控制器中显式调用
$this->validate($rules)或$this->validator->run($data, $rules) - 若想复用模型里的规则,可手动提取:
$rules = $this->userModel->getValidationRules();<br>$this->validate($rules);
- 注意:模型的
errors()方法只返回上一次validate()调用的结果,不是模型自身触发的
回调函数(callback_)规则完全重构
CI3 中 callback_check_email_exists 会自动查找控制器内同名 public 方法;CI4 中已废弃该语法,改用闭包或独立验证器类。
- 推荐方式:在控制器中用闭包定义逻辑
$rules['email'] = [ 'rules' => 'required|valid_email|is_unique[users.email]', 'errors' => ['is_unique' => '该邮箱已被注册'] ]; - 如需复杂逻辑(如查库+条件判断),直接在
validate()后手动处理,或注入Validation服务并添加自定义规则:$this->validator->setRule('custom_phone', '手机号', function($str) { return preg_match('/^1[3-9]\d{9}$/', $str); }); - 不要尝试在模型或 library 中定义 callback 方法,CI4 验证器不支持跨作用域调用
错误提示与表单回填需手动处理
CI4 不再提供 validation_errors() 或 set_value() 这类辅助函数,前端渲染和值保留全部交由开发者控制。
- 获取错误信息:
$this->validator->getErrors()返回关联数组,键为字段名,值为字符串 - 回填表单值:用
$this->request->getPost('field')或存入视图数据(如$data['email'] = old('email', $default)) - CI4 提供
old()辅助函数,可安全读取上次提交值:<input name="email" value="<?= old('email') ?>">


















