升级验证

库文档

变更点

  • 如果你想更改验证错误的显示方式,你需要设置 CI4 的 验证视图模板

  • CI4 验证中没有 CI3 中的 回调 <https://codeigniter.org.cn/userguide3/libraries/form_validation.html#id13>。 请使用 Callable Rules (从 v4.5.0 开始)或 Closure Rules (从 v4.3.0 开始)或 Rule Classes 代替。

  • 在 CI3 中,Callbacks/Callable 规则有优先级,但在 CI4 中,Closure/Callable 规则没有优先级,按列出的顺序进行检查。

  • 从 v4.5.0 开始引入了 Callable Rules,但它与 CI3 的 Callable 有些不同。

  • CI4 验证格式规则不允许空字符串。

  • CI4 验证永远不会更改你的数据。

  • 从 v4.3.0 开始,引入了 validation_errors(),但其 API 与 CI3 的不同。

升级指南

  1. 在包含表单的视图中进行更改:

    • <?php echo validation_errors(); ?> 改为 <?= validation_list_errors() ?>

  2. 在控制器中进行更改:

    • $this->load->helper(array('form', 'url')); 改为 helper('form');

    • 移除 $this->load->library('form_validation');

    • if ($this->form_validation->run() == FALSE) 改为 if (! $this->validateData($data, $rules)) 其中 $data 是要验证的数据,通常是 POST 数据 $this->request->getPost()

    • $this->load->view('myform'); 改为 return view('myform', ['validation' => $this->validator,]);

  3. 必须更改验证规则。新语法是在控制器中将规则设置为数组:

    <?php
    
    $isValid = $this->validateData($data, [
        'name'  => 'required|min_length[3]',
        'email' => 'required|valid_email',
        'phone' => 'required|numeric|max_length[10]',
    ]);
    

代码示例

CodeIgniter 3.x 版本

路径:application/views:

<html>
<head>
    <title>My Form</title>
</head>
<body>

    <?php echo validation_errors(); ?>

    <?php echo form_open('form'); ?>

    <h5>Username</h5>
    <input type="text" name="username" value="" size="50" />

    <h5>Password</h5>
    <input type="text" name="password" value="" size="50" />

    <h5>Password Confirm</h5>
    <input type="text" name="passconf" value="" size="50" />

    <h5>Email Address</h5>
    <input type="text" name="email" value="" size="50" />

    <div><input type="submit" value="Submit" /></div>

    </form>

</body>
</html>

路径:application/controllers:

<?php

class Form extends CI_Controller {

    public function index()
    {
        $this->load->helper(array('form', 'url'));

        $this->load->library('form_validation');

        // Set validation rules

        if ($this->form_validation->run() == FALSE) {
                $this->load->view('myform');
        } else {
                $this->load->view('formsuccess');
        }
    }
}

CodeIgniter 4.x 版本

路径:app/Views:

<html>
<head>
    <title>My Form</title>
</head>
<body>

    <?= validation_list_errors() ?>

    <?= form_open('form') ?>

    <h5>Username</h5>
    <input type="text" name="username" value="" size="50" />

    <h5>Password</h5>
    <input type="text" name="password" value="" size="50" />

    <h5>Password Confirm</h5>
    <input type="text" name="passconf" value="" size="50" />

    <h5>Email Address</h5>
    <input type="text" name="email" value="" size="50" />

    <div><input type="submit" value="Submit" /></div>

    </form>

</body>
</html>

路径:app/Controllers:

<?php

namespace App\Controllers;

use CodeIgniter\Controller;

class Form extends Controller
{
    public function index()
    {
        helper('form');

        $data = $this->request->getPost();

        if (! $this->validateData($data, [
            // Validation rules
        ])) {
            return view('myform');
        }

        return view('formsuccess');
    }
}