CodeIgniter 4表单未返回验证消息问题排查
表单验证错误提示不显示的原因分析
问题描述
已在HunterModel.php中配置完整的验证规则及自定义提示消息,但提交form_create.php表单后,页面仅返回表单,未展示任何输入错误提示信息。
相关代码
1. form_create.php 视图代码
<?php if (isset($validation)) : ?> <div class="text-danger"> <?= $validation->listErrors() ?> </div> <?php endif; ?> <form action="<?= site_url('create')?>" method="POST"> ... </form>
2. HunterController.php 的 createHunter() 方法
public function createHunter() { try { helper(['form']); $hunter = new HunterModel(); $data = [ 'name_hunter' => $this->request->getPost('name_hunter'), 'age_hunter' => $this->request->getPost('age_hunter'), 'height_hunter' => $this->request->getPost('height_hunter'), 'weight_hunter' => $this->request->getPost('weight_hunter'), 'type_hunter' => $this->request->getPost('type_hunter'), 'type_nen' => $this->request->getPost('type_nen'), 'type_blood' => $this->request->getPost('type_blood') ]; if ($hunter->insert($data)){ return $this->response->redirect(site_url('listing')); } else { $data['validation'] = $this->validator; echo view('form_create', $data); } } catch (\Exception $e) { exit($e->getMessage()); } }
3. HunterModel.php 的验证规则与自定义消息
// Validation protected $validationRules = [ 'nome_hunter' => 'required|max_length[30]', 'idade_hunter' => 'required|integer', 'altura_hunter' => 'required|decimal', 'peso_hunter' => 'required|decimal', 'tipo_hunter' => 'required|max_length[30]', 'tipo_nen' => 'required|max_length[30]', 'tipo_sanguineo' => 'required|max_length[3]' ]; protected $validationMessages = [ 'nome_hunter' => [ 'required' => 'O nome do Hunter não pode ficar vazio.', 'max_length' => 'O nome do Hunter precisa ter no máximo 30 caracteres.' ], 'idade_hunter' => [ 'required' => 'A idade do Hunter não pode ficar vazia.', 'integer' => 'A idade do Hunter precisa ser um número inteiro.' ], 'peso_hunter' => [ 'required' => 'O peso do Hunter não pode ficar vazio.', 'decimal' => 'O peso do Hunter precisa ser um número decimal.' ], 'altura_hunter' => [ 'required' => 'A altura do Hunter não pode ficar vazia.', 'decimal' => 'A altura do Hunter precisa ser um número decimal.' ], 'tipo_hunter' => [ 'required' => 'É necessário definir o tipo de Hunter.', 'max_length' => 'O tipo de Hunter precisa ter no máximo 30 caracteres.' ], 'tipo_nen' => [ 'required' => 'É necessário definir o nen do Hunter.', 'max_length' => 'O nen do Hunter precisa ter no máximo 30 caracteres.' ], 'tipo_sanguineo' => [ 'required' => 'É necessário definir o tipo sanguíneo do Hunter.', 'max_length' => 'O tipo sanguíneo do Hunter precisa ter no máximo 3 caracteres.' ] ];
核心原因:字段名完全不匹配
验证规则未触发的根本问题是Controller收集的字段名与Model验证规则中的字段名完全不一致:
- Controller中使用英语命名:
name_hunter、age_hunter、height_hunter等 - Model验证规则中使用葡萄牙语命名:
nome_hunter、idade_hunter、altura_hunter等
因为字段名对应不上,Model执行insert()时找不到需要验证的目标字段,完全跳过了验证逻辑,自然不会生成任何错误信息。返回表单时$validation变量没有错误内容,视图也就无法渲染错误提示。
修复方案
1. 统一所有环节的字段名
将Controller、视图表单、Model中的字段名统一为同一命名规则(全用英语或全用葡萄牙语):
- 例如把Controller中的
name_hunter改为nome_hunter,age_hunter改为idade_hunter,确保和Model验证规则中的字段名完全对应 - 同时修改视图表单的
name属性,比如<input name="nome_hunter">,保证提交的字段名与后端一致
2. 优化Controller验证逻辑(可选但更规范)
先调用Model的validate()方法明确验证数据,再执行插入,逻辑更清晰:
public function createHunter() { try { helper(['form']); $hunter = new HunterModel(); // 统一字段名与Model一致 $data = [ 'nome_hunter' => $this->request->getPost('nome_hunter'), 'idade_hunter' => $this->request->getPost('idade_hunter'), 'altura_hunter' => $this->request->getPost('altura_hunter'), 'peso_hunter' => $this->request->getPost('peso_hunter'), 'tipo_hunter' => $this->request->getPost('tipo_hunter'), 'tipo_nen' => $this->request->getPost('tipo_nen'), 'tipo_sanguineo' => $this->request->getPost('tipo_sanguineo') ]; // 先执行验证 if (!$hunter->validate($data)) { $data['validation'] = $hunter->errors(); echo view('form_create', $data); return; } // 验证通过再插入 if ($hunter->insert($data)){ return $this->response->redirect(site_url('listing')); } else { echo view('form_create', ['error' => '插入记录失败']); } } catch (\Exception $e) { exit($e->getMessage()); } }
内容的提问来源于stack exchange,提问作者user19935342
相关产品推荐
相关产品推荐

