您现在的位置是:网站首页>软件开发>开发终端>thinkphpthinkphp

验证

风口下的猪2019-06-09thinkphp

简介

tp5的验证主要用在表单验证,适合单一表单验证的项目,同样也适合定义一个大验证规则,派生多个验证表单的项目。验证主要依靠think下的Validate类。在使用验证类和定义验证器的地方一定要申明use think\Validate;

一.验证主体

验证主体由“规则内容”和“提示信息”两部分组成。一个良好的交互设计,不能没有提示信息。

1.1.规则内容

规则定义支持两种写法,即“竖线分割法”和“数组法

(1)竖线分割法(通过|,分离字段对应的多个规则)

$rules = [

'name' => 'require|max:25',

'age' => 'number|between:1,120',

];

$validate = new Validate($rules);

(2)数组法(定义数组的形式,定义每个字段对应的多个规则)

$rules = [

'name' => ['require','max'=>25],

'age' => ['number','between'=>'1,120'],

];

$validate = new Validate($rules);

1.2.提示信息

提示信息,主要采用属性定义的方式书写

$message = [

'name.require' => '名称必须',

'name.max' => '名称最多不能超过25个字符',

'age.number' => '年龄必须是数字',

'age.between' => '年龄只能在1-120之间',

'email' => '邮箱格式错误',

];

1.3.规则内容和提示信息的分开写以及合并写

(1)分开写

$rules = [

'name' => 'require|max:25',

'age' => 'number|between:1,120',

];

$message = [

'name.require' => '名称必须',

'name.max' => '名称最多不能超过25个字符',

'age.number' => '年龄必须是数字',

'age.between' => '年龄只能在1-120之间',

'email' => '邮箱格式错误',

];

$data = [

'name' => 'thinkphp',

'age' => 121,

'email' => 'thinkphp@qq.com',

];

$validate = new Validate($rules,$msg);

$result = $validate->check($data);

if(!$result){

echo $validate->getError();

}

(2)合并写

$rule = [

['name','require|max:25','名称必须|名称最多不能超过25个字符'],

['age','number|between:1,120','年龄必须是数字|年龄必须在1~120之间'],

['email','email','邮箱格式错误']

];

$data = [

'name' => 'thinkphp',

'age' => 121,

'email' => 'thinkphp@qq.com',

];

$validate = new Validate($rules);

$result = $validate->check($data);

if(!$result){

echo $validate->getError();

}

1.4.验证规则的额外添加rule()

在定义完规则内容后,如果不想手动修改规则内容,可通过rule()方法,动态添加规则。

例如:

$rules = [

'name' => 'require|max:25',

'age' => 'number|between:1,120',

];

$validate = new Validate($rules);

$validate->rule('zip', '/^\d{6}$/');

$validate->rule([

'email' => 'email',

]);

1.5.常见的规则

tp5常见的内置规则一般都包含了很多应用场景所需要的规则定义。大致分为8类:

(1)格式验证类;(eg: require、number、integer、email、alphaDash)

(2)长度和区间验证类;(eg:in:1,2,3、between:,10、length:4、max:25、before:2016-12-11)

(3)字段比较类;(eg: confirm:password、diffrent:count、eq:100)

(4)filter验证类;(eg: filter:validate_ip)

(5)正则验证类;(eg: zip:\d{6}、regex:zip)

(6)上传验证类;(eg: file、image、fileMime)

(7)行为验证类;(eg:behavior:\app\index\behavior\check)

(8)其他验证。

详情可参看开发手册相关链接:tp5内置规则

 

二.验证工具的实现

验证工具,即传入参数验证数据$data即可完成验证的实例化对象。

验证工具分为两种形式:验证器+Loard::validate('验证器')验证类实例化传入验证主体参数

 

2.1.Loard验证器验证工具(验证器+Loard::validate('验证器'))

其主要分为两个部分,第一部分是在项目文件夹下的validate文件夹下的验证器文件,里面定义的验证主体;第二部分是使用Loard类加载验证器并存入到实例化对象中,该对象拥有Validate类的所有方法。

  1. 定义验证主体的验证文件application/validate/Admin.php

namespace app\admin\validate;

use think\Validate;

 

class Admin extends Validate{

 

protected $rule=[

'admin_username'=>'require',

'admin_password'=>'require',

'code'=>'require|captcha'//一个字段有多个验证规则时,采用竖线隔开

];

protected $message=[

'admin_username.require'=>'请输入正确的用户名',

'admin_password.require'=>'请输入正确的密码',

'code.require'=>'请输入正确的验证码',

'code.captcha'=>'验证码不正确',

];

 

}

2. 完成验证工具的实现:
use think\Loader;     \\引入Loard类

$validate = Loader::validate('Admin');    \\使用Loader类加载validate类的代码,并且传入Admin.php验证器,将其存入到$validate对象中。

 

2.2.new Validate($rule)验证工具

这种方式比较传统,适合单一表单单一验证的项目,不适合一个验证主体对应多个表单的项目。

$rules = [

'name' => 'require|max:25',

'age' => 'number|between:1,120',

];

$message = [

'name.require' => '名称必须',

'name.max' => '名称最多不能超过25个字符',

'age.number' => '年龄必须是数字',

'age.between' => '年龄只能在1-120之间',

'email' => '邮箱格式错误',

];

$data = [

'name' => 'thinkphp',

'age' => 121,

'email' => 'thinkphp@qq.com',

];

$validate = new Validate($rules,$msg);

$result = $validate->check($data);

if(!$result){

echo $validate->getError();

}

三.验证场景

所谓的验证场景,指的是定义了大的验证主体,截取不同的验证规则用于不同的验证表单。

3.1定义验证场景规则(截取验证规则)

截取验证规则有两种方式:scene()函数法$scene变量法

(1)scene()函数法

$rule=[

'name'=>'require|max:25',

'age'=>'number|between:1,120',

'email'=>'email',

];

$validate=new Validate($rule,$msg);

$validate->scene('edit',['name','age']);

(2)$scene变量法

$rule=[

'name'=>'require|max:25',

'age'=>'number|between:1,120',

'email'=>'email',

];

$scene=[

'edit'=>['name','age'];

];

3.2修改截取的规则内容

在定义场景规则时,允许对截取的内容进行修改,这不影响原来的大验证主体

$rule=[

'name'=>'require|max:25',

'age'=>'number|between:1,120',

];

$scene=[

'edit'=>['name','age'=>'require|number|between:1,120']  //为age字段增加了require规则

];

3.3获得场景对象,使用scene()函数

$validate->scene('edit');

该场景对象含有validate的绝大多数方法,比如

$validate->scene('edit')->check($data);

 

四.执行验证和判断返回结果

执行验证主要分为两种情况“验证工具验证”和“非验证工具验证

这里梳理一下概念:验证工具(载入了验证主体的验证对象)验证,只需要加入验证数据$data便可执行验证,所以常常使用object->check($data);的形式执行验证。

而非验证工具验证,则是需要通过validate()等方法将验证主体(或验证场景)与验证数据加载进行比较。

4.1.验证工具验证

验证工具验证采用的是check()方法,形式是object(验证工具)->check($data);

eg:

        $validate = Loader::validate('Admin');//loard验证器验证工具
        $validate->check($data);
         $validate=new Validate($rules);//验证类验证工具
         $validate->check($data);

4.2.非验证工具验证

非验证工具验证,主要是采用validate方法,常常用在验证器验证和模型数据写入时验证。执行的对象是本类的实例化对象。例如在控制器里是$this->validate($data,$rule)。在模型中是$user=new User;  $user->validate($rule)->save($data).

(1)validata()语法

validate($data(可选),$rule(可以是规则内容数组、可以是验证器、可以是验证场景))

(2)控制器验证

   $result = $this->validate(
    [
        'name'  => 'thinkphp',
        'email' => 'thinkphp@qq.com',
    ],
    [
        'name'  => 'require|max:25',
        'email'   => 'email',
    ]);
    if(true !== $result){
    // 验证失败 输出错误信息
    dump($result);
}

调用方法的主要是$this。

(3)模型内传入数据验证

在模型中对传入数据库的数据验证,做到符合要求的数据传入到数据库中,进行了有效的把控。

A.当验证器和模型类同名时,可以采用validate(true

$User = new User;
   // 调用当前模型对应的User验证器类进行数据验证

$result = $User->validate(true)->save($data);

if(false === $result){// 验证失败 输出错误信息

dump($User->getError());

}

 

B.当验证器和模型类不同名时,要加载该验证器,即validate('Member')

 $User = new User;// 调用Member验证器类进行数据验证
    $result = $User->validate('Member')->save($data);
   if(false === $result){// 验证失败 输出错误信息

dump($User->getError());


}


4.3返回类型的不同

(1)在验证工具执行check(),无论验证是否通过,返回的都是布尔类型true和false。

所以$result=object->check()常常和

 if(!$result)if($result)联用

(2)在控制器中使用$this->validate(),返回的是数据类型,及提升信息。也就是说其在验证正确的情况下返回是boolean true,在验证错误情况返回string '提示错误信息'。

所以$result=$this->validate()常常和

 if(true!==$result)联用

(3)在模型中验证传入数据库的信息(模型中也可以验证不用传入数据的数据,直接采用验证工具执行验证即可),使用$user->validate('User.edit')->save($data),返回的数据类型是

A.验证错误时,返回boolean false;

B.验证正确,但save()失败,返回int 0;

C.验证正确,save()成功,返回int 1。

所以$result=$user->validate('User.edit')->save($data)常常和

if(false===$result)联用

 

五.打印或输出提示信息

输出错误信息,常常用object->getError()方法,但这只能返回错误信息。正确的提示信息,不能提示。

建议对返回结果进行判断,然后返回一个布尔类型和其对应的提示信息(无论错误还是失败)

例如:

if(!$result){

return ['void'=>0,'msg'=>'验证失败'];

}

else{

return ['void'=>1,'msg'=>'验证成功'];

}

 

六.静态调用

如果需要使用内置的规则验证单个数据,可以使用静态调用的方式。

// 日期格式验证
Validate::dateFormat('2016-03-09','Y-m-d'); // true
// 验证是否有效的日期
Validate::is('2016-06-03','date'); // true
// 验证是否有效邮箱地址
Validate::is('thinkphp@qq.com','email'); // true
// 验证是否在某个范围
Validate::in('a',['a','b','c']); // true
// 验证是否大于某个值
Validate::gt(10,8); // true
// 正则验证
Validate::regex(100,'\d+'); // true

很赞哦! (0)

  • 软件开发
  • 素质要求
  • 计算机基础
  • 架构
  • 安全
  • 性能
  • 运维
  • 尾页
  • 数据库
  • 开发终端
  • 语言基础
  • 项目管理
  • 产品设计
  • 系统
  • 工作规范
  • 计算机网络
  • 前端技术栈
  • 数据结构
  • 计算机组成原理
  • 后端技术栈
  • 性能优化
  • 安全设计
  • 常见模块
  • 计算机操作系统
  • 服务器
  • python
  • MySQL
  • thinkphp
  • PHP
  • Java
  • JavaScript
  • Windows
  • Linux
  • 特效
  • indexedDB
  • vue
  • 淘宝联盟
  • Ionic
  • Angular
  • 微信小程序
  • 支付宝小程序
  • uni-app
  • css/sass/less
  • 支付
  • socket
  • 爬虫
  • web性能优化
  • 消息推送
  • CVM
  • sqlite
  • Redis
  • 前端基础
  • 基础
  • element
  • Nginx
  • yii2
  • /ponder/index.php/index/catelist/catelist/cateid/10.html

    相关阅读 (同一栏目)

    << /

    标签云

    站点信息

    • 文章统计:528篇
    • 移动端访问:扫码进入SQ3R