IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 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());
        }
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:56:38  更:2022-03-15 22:57:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 0:14:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码