Skip to content

验证器

验证器是ThinkPHP框架提供的数据验证机制,用于验证用户输入数据的合法性。

验证器基本结构

验证器文件位置

验证器文件通常位于插件的app/validate目录下,按照功能模块进行分类。例如:

niucloud/addon/hello_world/app/validate/
├── user/
│   └── User.php          # 用户相关验证器
└── order/
    └── Order.php         # 订单相关验证器

验证器基本代码结构

验证器类需要继承core\base\BaseValidate类,并定义以下三个主要属性:

php
<?php

namespace addon\hello_world\app\validate\user;

use core\base\BaseValidate;

/**
 * 用户验证器
 * Class User
 * @package addon\hello_world\app\validate\user
 */
class User extends BaseValidate
{
    // 验证规则
    protected $rule = [
        'user_name' => 'require|max:50',
        'mobile' => 'require|mobile',
        'status' => 'number|between:0,1',
    ];

    // 错误提示消息
    protected $message = [
        'user_name.require' => [ 'common_validate.require', [ 'user_name' ] ],
        'user_name.max' => [ 'common_validate.max', [ 'user_name', 50 ] ],
        'mobile.require' => [ 'common_validate.require', [ 'mobile' ] ],
        'mobile.mobile' => [ 'common_validate.mobile', [ 'mobile' ] ],
        'status.number' => [ 'common_validate.number', [ 'status' ] ],
        'status.between' => [ 'common_validate.between', [ 'status', 0, 1 ] ],
    ];

    // 验证场景
    protected $scene = [
        "add" => [ 'user_name', 'mobile', 'status' ],
        "edit" => [ 'user_name', 'status' ],
        "login" => [ 'mobile' ],
    ];
}

验证规则详解

内置验证规则

ThinkPHP框架提供了丰富的内置验证规则,常用的有:

规则名称说明示例
require必填'user_name' => 'require'
max最大长度'user_name' => 'max:50'
min最小长度'password' => 'min:6'
number数字'age' => 'number'
between数值范围'status' => 'between:0,1'
mobile手机号'mobile' => 'mobile'
email邮箱'email' => 'email'
gt大于'id' => 'gt:0'
lt小于'score' => 'lt:100'
eg等于'type' => 'eg:1'

复合验证规则

可以同时设置多个验证规则,使用竖线|分隔:

php
protected $rule = [
    'user_name' => 'require|max:50|min:2',
    'mobile' => 'require|mobile',
];

错误提示消息

错误提示消息通过$message数组定义,格式为:

php
'字段名.规则名' => [ '错误信息标识', [ '参数1', '参数2', ... ] ]

其中,错误信息标识通常对应语言包中的翻译键,参数会被替换到错误信息中。

示例:

php
protected $message = [
    'user_name.require' => [ 'common_validate.require', [ 'user_name' ] ],
    'user_name.max' => [ 'common_validate.max', [ 'user_name', 50 ] ],
];

验证场景

验证场景仅针对验证器有效,独立验证不存在验证场景的概念。

验证场景通过$scene数组定义,用于指定在不同场景下需要验证的字段:

php
protected $scene = [
    "add" => [ 'user_name', 'mobile', 'status' ],      // 添加场景需要验证的字段
    "edit" => [ 'user_name', 'status' ],               // 编辑场景需要验证的字段
    "login" => [ 'mobile', 'password' ],               // 登录场景需要验证的字段
];

自定义验证规则

除了使用内置验证规则外,还可以在验证器类中定义自定义验证规则。自定义验证规则方法的命名格式为check[字段名]

php
<?php

namespace addon\hello_world\app\validate\user;

use core\base\BaseValidate;

class User extends BaseValidate
{
    // 验证规则
    protected $rule = [
        'user_name' => 'require|customCheck',
    ];

    // 错误提示消息
    protected $message = [
        'user_name.require' => [ 'common_validate.require', [ 'user_name' ] ],
        'user_name.customCheck' => [ 'custom_validate.user_name_invalid', [ 'user_name' ] ],
    ];

    // 自定义验证规则
    protected function customCheck($value, $rule, $data = [])
    {
        // 自定义验证逻辑
        // 返回true表示验证通过,返回错误信息字符串表示验证失败
        if ($value === 'admin') {
            return '用户名不能为admin';
        }
        return true;
    }
}

验证器的使用

$this->validate($data, 'addon\hello_world\app\validate\User.add');

基于 MIT 协议发布