tp6验证参数的几种方式详解

tp6验证参数的几种方式详解

控制器直接验证

好处是在控制器一眼就能看到有那些验证规则,复用性比较差,每个方法都需要复制一份

1.validate助手函数验证

示例代码

        $params = input();
        //验证
        try {
            validate([
                'name|商品名称' => 'require|chsDash',
                'desc|商品描述' => 'require|chsDash',
                'imgs|商品图片' => 'require|checkimgs',
                'stock|库存' => 'require|number|>:0',
                'sell_price|售价' => 'require|float|>:0',
            ])->check($params);
        } catch (ValidateException $exception) {
            return fail($exception->getMessage());
        }

全局拓展验证规则

我们看到上面的代码有个自定义验证规则checkimgs,我们需要在
api/app/AppService.php文件的boot方法中写验证规则,具体可以参看官方手册
参考

        // 服务启动
        Validate::maker(function ($validate) {
            $validate->extend('checkimgs', function ($value) {
                if (!is_array($value)) {
                    return false;
                }
                foreach ($value as $v) {
                    return in_array(pathinfo($v, PATHINFO_EXTENSION), ['jpeg', 'jpg', 'png']);
                }
                return true;
            }, ':attribute格式错误');
      });

extend方法,第二个参数是一个匿名函数,返回值必须是true或者false

自定义错误信息

还可以给自定义规则自定义错误信息

        //验证
        try {
            validate([
                'name|商品名称' => 'require|chsDash',
                'desc|商品描述' => 'require|chsDash',
                'imgs|商品图片' => 'require|checkimgs',
                'stock|库存' => 'require|number|>:0',
                'sell_price|售价' => 'require|float|>:0',
            ],[
                'imgs.require'=>'商品图片必填',
                'imgs.checkimgs'=>'商品图片必须是一个数组,且格式为jpeg,jpg,png',
            ])->check($params);
        } catch (ValidateException $exception) {
            return fail($exception->getMessage());
        }

如果是使用这种方式验证,那么自定义规则方法必须返回true或者false,返回字符串就会报错

在这里插入图片描述

2.rule方法验证

参考地址:
https://www.kancloud.cn/manual/thinkphp6_0/1037625

示例代码

同样需要在api/app/AppService.php文件的boot方法中写验证规则

        Validate::maker(function ($validate) {
            $validate->extend('check_float', function ($value, $rule) {
                $ruleArr = explode(',', $rule);
                $ruleIntLong = $ruleArr[0];   //整数位数
                $ruleFloatLong = $ruleArr[1];  //小数位数
                $valueArr = explode('.', $value);
                $valueIntLong = strlen($valueArr[0]);
                $valueFloatLong = isset($valueArr[1]) ? strlen($valueArr[1]) : 0;
                return $ruleFloatLong < $valueFloatLong ? false : true;
            }, ':attribute格式错误');
        });

在控制器调用

        $params = input();
        $validate = Validate::rule([
            'num|数字' => 'require|check_float:3,3',
        ]);
        $validate->message([
            'num.require' => '这是必填的哦,不填你是想怎么样?',
//            'num.check_float' => '数字不规范呀',
        ]);
        if (!$validate->check($params)) {
            return fail($validate->getError());
        }

自定义错误消息

如果自定义的验证规则方法中,返回的是truefalse,那么当返回为false的时候,可以提示自定义的消息,如果方法中直接返回的字符串true,那么$validate->message方法中对自定义规则进行错误消息自定义是无效的,它会直接使用返回的字符串内容作为错误信息。

比如我们返回字符串true

        Validate::maker(function ($validate) {
            $validate->extend('check_float', function ($value, $rule) {
                $ruleArr = explode(',', $rule);
                $ruleIntLong = $ruleArr[0];   //整数位数
                $ruleFloatLong = $ruleArr[1];  //小数位数
                $valueArr = explode('.', $value);
                $valueIntLong = strlen($valueArr[0]);
                $valueFloatLong = isset($valueArr[1]) ? strlen($valueArr[1]) : 0;
                return $ruleFloatLong < $valueFloatLong ? '小数位长度不能大于' . $ruleFloatLong . '位!' : true;
            }, ':attribute格式错误');
        });

同时在控制器中$validate->message方法里也定义了错误信息

        $params = input();
        $validate = Validate::rule([
            'num|数字' => 'require|check_float:3,3',
        ]);
        $validate->message([
            'num.require' => '这是必填的哦,不填你是想怎么样?',
           'num.check_float' => '数字不规范呀',
        ]);
        if (!$validate->check($params)) {
            return fail($validate->getError());
        }

我们传递一个测试数值试试

在这里插入图片描述

我们看到及时,我们传递了自定义错误信息,它是没有效果的。
在这里插入图片描述

创建验证器验证

好处是复用性比较好,假如你开发了一个项目写了很多值得收藏的验证规则,那么下个项目开始的话直接复制粘贴所有文件就可以了,毕竟是单独的一个文件夹,如果是控制器的话,还需要再去复制验证规则,假如有很多地方都需要验证,那么直接调用就行了了,缺点,每次都要创建一个验证类文件,每次查看规则都要再跳转一个文件

1.创建验证器

php think make:validate adminapi@Goods
<?php
declare (strict_types=1);
namespace app\adminapi\validate;
use think\Validate;
class Goods extends Validate
{
    /**
     * 定义验证规则
     * 格式:'字段名' =>  ['规则1','规则2'...]
     *
     * @var array
     */
    protected $rule = [
        'id' => 'require|number',
        'name|商品名称' => 'require|chsDash',
        'desc|商品描述' => 'require|chsDash',
        'imgs|商品图片' => 'require|checkImg',
        'stock|库存' => 'require|number|>:0',
        'sell_price|售价' => 'require|float|>:0',
        'category_id|分类ID' => 'require|number',
    ];
    /**
     * 定义错误信息
     * 格式:'字段名.规则名' =>  '错误信息'
     *
     * @var array
     */
    protected $message = [];
    protected $scene = [
        'save' => ['name', 'desc', 'imgs', 'stock', 'sell_price','category_id'],
        'update' => ['id', 'name', 'desc', 'imgs', 'stork', 'sell_price','category_id'],
    ];
    protected function checkImg($imgs)
    {
        $imgs = json_decode($imgs, true);
        if (!is_array($imgs)) {
            return '请重新上传图片';
        }
        foreach ($imgs as $img) {
            return in_array(pathinfo($img, PATHINFO_EXTENSION), ['jpeg', 'jpg', 'png']);
        }
        return true;
    }
}

2.控制器调用

        $params = input();
        try {
            validate(\app\adminapi\validate\Goods::class)
                ->scene('save')
                ->check($params);
        } catch (ValidateException $e) {
            // 验证失败 输出错误信息
            return fail($e->getError());
        }
                       

点击阅读全文

上一篇 2023年 6月 13日 am10:12
下一篇 2023年 6月 13日 am10:14