# 升级表单验证

## 类文档

- CodeIgniter 3.x 表单验证文档

- CodeIgniter 4.x 验证文档

## 变更内容

- 如果要更改验证错误的显示方式，必须在 CI4 中设置 validation View templates。

- CI4 的验证功能不包含 CI3 中的 回调。 请改用 Callable 规则 （自 v4.5.0 起）、 Closure 规则 （自 v4.3.0 起）或 Rule Classes。

- 在 CI3 中，Callbacks/Callable 规则具有更高优先级；但在 CI4 中，Closure/Callable 规则没有优先级之分，而是按列出的顺序进行检查。

- 自 v4.5.0 起，引入了 Callable 规则，但它与 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');
        }
    }