🌟Validator 验证器 和 常用方法

v1.2.7 版本
2025-04-08 版本更新时间
50 安装
1 star

Jeckleee/Tools

一些常用工具:

  • 数据验证 : 总是记不住验证器的规则,每次都得查询文档,所以本工具提供了一个符合直觉的验证器,使用链式调用添加规则,方便记忆和使用
  • 常用Function :封装了一些常用的方法

安装

composer require jeckleee/tools

配置

//配置文件: config/plugin/jeckleee/tools/app.php

return [
    'enable' => true,

    // 定义验证失败以后抛出的异常,webman框架建议使用 BusinessException::class
    'exception' => Exception::class,

    // 定义验证失败的错误码
    'exception_code' => 500,

    //验证失败错误如何返回(immediate,collective)
    //immediate:立即返回,只要验证出现错误,立即抛出当前错误字段的异常信息,不再验证剩余的字段
    //collective:集中返回,验证全部字段,收集所有异常,验证结束后在异常$e->getMessage()中返回错误字段的列表,json字符串形式
    'error_return_mode' => 'immediate',

];

查看所有支持的验证规则

use Jeckleee\Tools\Validator
echo json_encode(Validator::$showAllRules);
//此工具已经收集了大多数的常用规则,欢迎大家提交pr补充新的规则
验证规则 说明
required 字段必填,可设置一个默认值
ifExisted 对字段进行判断,如果字段存在,则进行验证
strTrim 去除字段两端的空格、制表符、换行符等
strLength 字段的值知必须指定范围的长度
strStartWith 字段的值必须以指定的字符串开始
strEndWith 字段的值必须以指定的字符串结尾
strAlpha 字段的值只能由字母组成
strAlphaNum 字段的值只能由字母和数字组成,$type=true时要求必须同时包含字母和数字
betweenNumber 对字段进行比较,是betweenNumber方法的补充,允许的符号:>,<,>=,<=,!=,=
isNumber 字段的值必须是数字(int or float)
isInt 字段的值必须是整数
isFloat 字段的值必须是小数,传入参数控制小数位数
inArray 字段的值必须在数组中
notInArray 字段的值必须不在数组中
isArray 字段的值必须是数组
isEmail 字段的值必须是邮箱
isMobile 字段的值必须是手机号
isDateTimeInFormat 字段的值必须是指定格式的时间字符串(Ymd-His等)
isIdCard 字段的值必须是身份证号
isUrl 字段的值必须是网址
isIp 字段的值必须是IP地址(ipv4 or ipv6)
isBool 字段的值必须是布尔值,为 "1", "true", "on" and "yes" 返回 TRUE,<br/>为 "0", "false", "off" and "no" 返回 FALSE
isJson 字段的值必须是一个json字符串,允许传入参数将其转为Array
withRegex 使用正则表达式验证字段

使用场景1:验证表单提交的数据

use Jeckleee\Tools\Validator

$post=['name'=>'jeckleee','password'=>'123456','email'=>'jeckleee@qq.com','age'=>18];

//验证一组数据
$data=Validator::array($post,[
     //只有写在此数组中的字段才会验证并存储到$data中
     Validator::field('name')->required()->strTrim()->strLength(3,32)->verify('请填写正确的用户名'),

     //使用自定义正则表达式验证
     Validator::field('password')->required()->withRegex('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/')->verify('要求密码必须包含大写字母、小写字母、数字和特殊字符'),
     Validator::field('email')->required()->isEmail()->verify('请填写正确的邮箱'),

     //不验证score字段,如果字段不存在则返回["score"=>null]
     Validator::field('score')->verify(),

     //存在则验证,如果字段不存在则不验证,也不会出现在最终的数据中
     Validator::field('score')->ifExisted()->isInt()->betweenNumber(0,100)->verify('请填写正确的分数'),

]);
//$data=['name'=>'jeckleee','password'=>'123456','email'=>'jeckleee@qq.com','score'=>null]; //age字段不会出现在$data中

// 按需使用 extract 函数将关联数组转换为变量
extract($data);
// 现在可以使用这些变量了
echo $name; // 输出: jeckleee
echo $password;  // 输出: 123456
echo email; // 输出: jeckleee@qq.com

验证一个字段

//验证一个字段
$data=Validator::one($post,[
     Validator::field('age')->required()->isInt()->betweenNumber(1,120)->verify('请填写正确的年龄'),
]);
echo $data; //$data=18

自定义验证规则


//自定义验证方法,只有回调方法返回(bool)true时,才验证通过,否则验证失败
$data=Validator::one($post,[
     Validator::field('age')->fun(function ($value){
         if ($value<18){
             return false;
         }
         return true;
     })->verify('年龄不能小于18岁'),
]);

自定义验异常和错误码

//自定义验证失败的异常
$data=Validator::array($post,[
     //......省略
],MyException::class);
//如果不定义异常类,则使用配置文件中定义的异常

//三种异常定义的区别:
//1.使用配置文件中定义异常和错误码
$data=Validator::array($post,[
      Validator::field('name')->required()->verify('请填写账号'),
      //......省略
]);

//2.在使用array()或者one()方法时定义异常和错误码,会覆盖配置文件中定义的异常
$data=Validator::array($post,[
    Validator::field('name')->required()->verify('请填写账号'),
    //......省略
],MyException::class);

//3.在规则中的->verify()方法中定义的错误码优级最高,会覆盖之前所有的定义
$data=Validator::array($post,[
      Validator::field('name')->required()->verify('请填写账号',12001),
      Validator::field('age')->required()->isInt()->betweenNumber(1,120)->verify('请填写正确的年龄',12002),
      //......省略
]);

一个使用示例

use Jeckleee\Tools\Validator as V;
use support\Request;

class PostController extends BaseController

{
    /**
     * @Notes: 保存数据
     * @Name save
     * @return \support\Response
     * @author: -
     * @Time: 2024/2/5 15:06
     */
    public function save(Request $request): \support\Response
    {

        try {
            $input = V::array($request->all(), [
                V::field('title')->required()->verify('请填写标题'),
                V::field('content')->required()->verify('请填写内容'),
                V::field('category_id')->required(1)->isInt()->inArray([1,2,3,4])->verify('请选择正确的分类'),
                V::field('status')->required(-1)->inArray([-1, 1, 2, 9])->verify('请选择正确的状态'),
            ]);
            $post = Post::create($input);
            $this->msg = '保存成功';
        } catch (BusinessException $exception) {
            $this->code = $exception->getCode() ?: 300;
            $this->msg = $exception->getMessage();
            $this->status = 'error';
        }

        return json($this->getFormatApiData());//getFormatApiData是一个我自己的自定义方法,返回格式化后的数据或者错误
    }

使用场景2: 验证变量是否正确,返回(bool) TURE or FALSE

use Jeckleee\Tools\Validator as V;

$phone='123456789';

if (V::var($phone)->isMobile()->check()){
    echo '手机号码正确';
}else{
    echo '手机号码不正确'
}

注意事项

  • 暂无
赞助商