验证器

ThinkPHP推荐使用验证器,可以在控制器中使用validate助手函数(或者封装验证方法)进行验证

验证器定义

app\validate\User.php

<?php

namespace app\validate;

use think\Validate;

class User extends Validate
{
    // 验证规则
    protected $rule =   [
        'name'  => 'require|max:25',
        'age'   => 'number|between:1,120',
        'email' => 'email',    
    ];

    // 定义错误提示信息
    protected $message  =   [
        'name.require' => '名称必须',
        'name.max'     => '名称最多不能超过25个字符',
        'age.number'   => '年龄必须是数字',
        'age.between'  => '年龄只能在1-120之间',
        'email'        => '邮箱格式错误',    
    ];

}

数据验证

app\controller\Index.php

<?php
namespace app\controller;

use app\validate\User;
use think\exception\ValidateException;

class Index
{
    public function index()
    {
        try {
            validate(User::class)->check([
                'name'  => 'thinkphp',
                'email' => 'thinkphp@qq.com',
            ]);
        } catch (ValidateException $e) {
            // 验证失败 输出错误信息
            dump($e->getError());
        }
    }
}

批量验证

默认情况下,一旦有某个数据的验证规则不符合,就会停止后续数据及规则的验证,如果希望批量进行验证,可以设置

app\controller\Index.php

<?php
namespace app\controller;

use app\validate\User;
use think\exception\ValidateException;

class Index
{
    public function index()
    {
        try {
            $result = validate(User::class)->batch(true)->check([
                'name'  => 'thinkphp',
                'email' => 'thinkphp@qq.com',
                ]);

            if (true !== $result) {
                // 验证失败 输出错误信息
                dump($result);
            }
        } catch (ValidateException $e) {
            // 验证失败 输出错误信息
            dump($e->getError());
        }
    }
}

验证场景

验证器支持定义场景,并且验证不同场景的数据

app\index\validate\User.php

<?php

namespace app\index\validate;

use think\Validate;

class User extends Validate
{
    /**
     * 定义验证规则
     * 格式:'字段名' =>  ['规则1','规则2'...]
     *
     * @var array
     */
    protected $rule =   [
        //email字段,必须是必填、唯一的对照admin表
        'username' => 'require|unique:admin',
        'password' => 'require', //必填
        'salt' => 'require', //必填
        'nickname' => 'require', //必填
        'state' => 'number|in:0,1',  //给字段设置范围   
    ];

    /**
     * 定义错误信息
     * 格式:'字段名.规则名' =>  '错误信息'
     *
     * @var array
     */
    protected $message  =   [
        'username.require' => '用户名必填',
        'username.unique' => '用户名已存在,请重新输入',
        'password.require'  => '密码必填',
        'nickname.require'  => '昵称必填',
        'salt.require'      => '密码盐必填',
        'state.number'    => '账号状态必须是个数字',
    ];

    /**
     * 定义验证场景
     * 格式:'场景' => ['字段名1','字段名2']
     */
    protected $scene = [
        'edit'  =>  ['username','nickname'],
    ];
}

在控制器里面调用User验证器

app\index\controller\Index.php

<?php

declare(strict_types=1);

namespace app\index\controller;

use app\BaseController;
use app\index\model\User;
use think\exception\ValidateException;

class Index extends BaseController
{
    public function index()
    {
        // 更新数据
        $data = [
            'username' => 'aaa',
            'nickname' => 'ddd'
        ];

        try {
            // 调用User验证器验证数据
            $this->validate($data,'app\index\validate\User.edit');

            // 更新数据表
            $user = User::where(['id' => 3])->save($data);

            // 判断是否更新失败
            if($user == FALSE)
            {
                // 定义异常错误信息
                throw new \Exception('更新失败');
            }else{
                dump('更新成功');
            }
        } catch (ValidateException $e) {
            // 验证失败 输出错误信息
            dump($e->getError());
        } catch (\Exception $error){
            // 输出错误信息
            dump($error->getMessage());
        }
    }
}

内置规则

系统内置了一些常用的验证规则,可以完成大部分场景的验证需求

// 验证某个字段必须,例如:
'name'=>'require'

// 验证某个字段的值是否为数字(采用filter_var验证),例如:
'num'=>'number'

// 验证某个字段的值是否为浮点数字(采用filter_var验证),例如:
'num'=>'float'

// 验证某个字段的值是否为布尔值(采用filter_var验证),例如:
'num'=>'boolean'

// 验证某个字段的值是否为email地址(采用filter_var验证),例如:
'email'=>'email'

// 验证某个字段的值是否为数组,例如:
'info'=>'array'

// 验证某个字段是否为为 yes, on, 或是 1。这在确认"服务条款"是否同意时很有用,例如:
'accept'=>'accepted'

// 验证值是否为有效的日期,例如:
'date'=>'date'

// 验证某个字段的值是否为字母,例如:
'name'=>'alpha'

// 验证某个字段的值是否为字母和数字,例如:
'name'=>'alphaNum'

// 验证某个字段的值是否为字母和数字,下划线_及破折号-,例如:
'name'=>'alphaDash'

// 验证某个字段的值只能是汉字,例如:
'name'=>'chs'

// 验证某个字段的值只能是汉字、字母,例如:
'name'=>'chsAlpha'

// 验证某个字段的值只能是汉字、字母和数字,例如:
'name'=>'chsAlphaNum'

// 验证某个字段的值只能是汉字、字母、数字和下划线_及破折号-,例如:
'name'=>'chsDash'

// 验证某个字段的值是否为有效的域名或者IP,例如:
'host'=>'activeUrl'

// 验证某个字段的值是否为有效的URL地址(采用filter_var验证),例如:
'url'=>'url'

// 验证某个字段的值是否为有效的IP地址(采用filter_var验证),例如:
'ip'=>'ip'

// 验证某个字段的值是否为指定格式的日期,例如:
'create_time'=>'dateFormat:y-m-d'

// 验证某个字段的值是否在某个范围,例如:
'num'=>'in:1,2,3'

// 验证某个字段的值不在某个范围,例如:
'num'=>'notIn:1,2,3'

// 验证某个字段的值是否在某个区间,例如:
'num'=>'between:1,10'

// 验证某个字段的值不在某个范围,例如:
'num'=>'notBetween:1,10'

// 验证某个字段的值的长度是否在某个范围,例如:
'name'=>'length:4,25'

// 验证某个字段的值的最大长度,例如:
'name'=>'max:25'

// 验证某个字段的值的最小长度,例如:
'name'=>'min:5'

// 验证某个字段的值是否在某个日期之后,例如:
'begin_time' => 'after:2016-3-18',

// 验证某个字段的值是否在某个日期之前,例如:
'end_time'   => 'before:2016-10-01',
powered by GitbookEdit Time: 2023-04-08 10:28:32