
在 codeigniter 4 中,模型(model)定义的 `$validationrules` 不会自动触发验证;必须在控制器中显式调用 `validate()` 方法,否则 `errors()` 始终返回空数组。
CodeIgniter 4 的验证机制与旧版不同:模型中的 validationRules 仅作为规则配置的容器,并不自动执行验证逻辑。若未主动调用验证方法(如 $this->validate()),系统不会校验输入数据,$model->errors() 自然返回空数组 —— 这正是你遇到问题的根本原因。
✅ 正确做法是:在控制器中使用内置的 validate() 辅助方法(或 Validation 服务),传入规则与消息,并在失败时通过 $this->validator->getErrors() 获取错误信息。
以下是推荐的完整实现流程:
1. 控制器中执行验证(推荐方式)
// 在控制器方法中(例如 login POST 处理)
if ($this->request->getMethod() === 'post') {
// 定义验证规则与自定义消息
$rules = [
'username' => 'required|min_length[3]|max_length[30]',
'password' => 'required|min_length[6]'
];
$messages = [
'username' => [
'required' => '用户名不能为空',
'min_length' => '用户名至少需 3 个字符'
],
'password' => [
'required' => '密码不能为空',
'min_length' => '密码长度不能少于 6 位'
]
];
// 执行验证(自动绑定 $_POST 数据)
if ($this->validate($rules, $messages)) {
// 验证通过:查询用户
$userModel = new \App\Models\Users();
$user = $userModel->where('username', $this->request->getPost('username'))
->first();
if ($user && password_verify($this->request->getPost('password'), $user['password'])) {
// 登录成功,跳转或设置 session
return redirect()->to('/dashboard');
} else {
// 用户不存在或密码错误
return redirect()->back()
->with('errors', ['用户名或密码错误'])
->withInput();
}
} else {
// 验证失败:获取所有错误信息
return redirect()->back()
->with('errors', $this->validator->getErrors())
->withInput();
}
}2. 视图中安全渲染错误(增强版)
has('errors')): ?>
- = esc($error) ?>
⚠️ 关键注意事项:
- ❌ 不要依赖模型的 errors() 而不先调用验证:$model->errors() 仅返回上一次模型级验证(如 insert()/update() 内置验证)的错误,而默认不启用。
- ✅ 若坚持在模型中验证,需手动调用:
$userModel = new \App\Models\Users(); $userModel->setValidationRules($rules)->setValidationMessages($messages); if (!$userModel->validate($this->request->getPost())) { $errors = $userModel->errors(); // 此时才有值 } - ? 始终对输出的错误信息使用 esc() 函数,防止 XSS 漏洞;
- ? withInput() 可保留表单数据,配合 old() 辅助函数在视图中回填:。
总结
CodeIgniter 4 的验证是“按需触发”而非“自动绑定”。将规则写在模型中只是便于复用和维护,真正生效必须由控制器显式驱动。掌握 validate() + $this->validator->getErrors() 这一组合,才能让表单验证可靠工作。










