You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:55:29