CodeIgniter 4 表单验证为何返回空数组?正确用法详解

9次阅读

CodeIgniter 4 表单验证为何返回空数组?正确用法详解

在 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')): ?>     

⚠️ 关键注意事项:

  • 不要依赖模型的 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() 辅助函数在视图中回填:表单验证可靠工作。

text=ZqhQzanResources