
在 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 AppModelsUsers(); $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 AppModelsUsers(); $userModel->setValidationRules($rules)->setValidationMessages($messages); if (!$userModel->validate($this->request->getPost())) { $errors = $userModel->errors(); // 此时才有值 } - ? 始终对输出的错误信息使用 esc() 函数,防止 xss 漏洞;
- ? withInput() 可保留表单数据,配合 old() 辅助函数在视图中回填:表单验证可靠工作。