請(qǐng)求參數(shù)校驗(yàn)
1.前言
本小節(jié)主要介紹如何使用 ThinkPHP
提供的 Validate
驗(yàn)證器,它可以在控制器接收參數(shù)之前驗(yàn)證參數(shù),若參數(shù)不合符業(yè)務(wù)要求,就會(huì)返回相應(yīng)的錯(cuò)誤提示,在實(shí)際工作中,數(shù)據(jù)校驗(yàn)的是一項(xiàng)必不可少的工作,數(shù)據(jù)的嚴(yán)格校驗(yàn)可能減少很多不必要的代碼執(zhí)行,這從某種層面來(lái)說(shuō)減少了服務(wù)器壓力,從安全角度來(lái)說(shuō),數(shù)據(jù)校驗(yàn)?zāi)鼙苊饽承┎槐匾?BUG
,比如對(duì)手機(jī)號(hào)碼的校驗(yàn),能有效地阻止后期發(fā)送短信失敗導(dǎo)致的 BUG
能有效地防止 XSS
、SQL注入
等攻擊。
2.新建驗(yàn)證器類
這里以之前添加學(xué)生接口為例,該接口入?yún)⑿枰?學(xué)生姓名(name)
、年齡(age)
、身份證號(hào)(id_number)
,首先新建一個(gè) app\Validate
目錄,然后在該目錄下新建一個(gè) StudentValidate
類,代碼如下:
<?php
namespace app\Validate;
use think\Validate;
class StudentValidate extends Validate
{
}
如下圖所示:
3.設(shè)置字段驗(yàn)證規(guī)則
字段的驗(yàn)證規(guī)則可以在 protected $rule
中設(shè)置如下規(guī)則:
/**
* 設(shè)置字段驗(yàn)證規(guī)則
* @var string[]
*/
protected $rule = [
'name' => 'require|max:5',
'age' => 'number|between:1,120',
'id_number' => 'require|in:18',
];
如下圖所示:
4.設(shè)置不滿足規(guī)則的提示語(yǔ)
若想要設(shè)置不滿足驗(yàn)證規(guī)則字段的錯(cuò)誤提示語(yǔ),可在 protected $message
中設(shè)置如下內(nèi)容:
/**
* 設(shè)置不滿足字段要求的提示語(yǔ)
* @var string[]
*/
protected $message = [
'name.require' => '學(xué)生姓名不能為空',
'name.max' => '學(xué)生姓名長(zhǎng)度不能超過(guò)5',
'age.number' => '學(xué)生年齡必須是數(shù)字',
'age.between' => '學(xué)生年齡值必須是1-120之間',
'id_number.require' => '學(xué)生身份證號(hào)不能為空',
'id_number.in' => '學(xué)生身份證號(hào)必須是18位'
];
如下圖所示:
5.設(shè)置驗(yàn)證場(chǎng)景
若想要在不同場(chǎng)景下驗(yàn)證不同的字段,可在 protected $scene
總設(shè)置如下內(nèi)容:
/**
* 設(shè)置驗(yàn)證場(chǎng)景
* @var string[][]
*/
protected $scene = [
'add-student' => ['name', 'age', 'id_number'],
'edit-student' => ['name', 'age']
];
如下圖所示:
6.在控制器中調(diào)用驗(yàn)證器
可以在學(xué)生添加接口的控制器中增加如下內(nèi)容:
validate(StudentValidate::class)->scene('add-student')->check($this->request->param());
如下圖所示:
Tips: 其中
validate()
是一個(gè)框架提供的一個(gè)輔助函數(shù),scene('add-student')
表示驗(yàn)證場(chǎng)景是add-student
,$this->request->param()
表示接口傳入的參數(shù)。
7.請(qǐng)求接口驗(yàn)證
在 postman
中請(qǐng)求上述接口,如下圖是缺少學(xué)生 name
字段提示的錯(cuò)誤:
學(xué)生 name
字段超過(guò)長(zhǎng)度提示如下:
8.內(nèi)置驗(yàn)證規(guī)則表
下面列出 ThinkPHP
提供的內(nèi)置驗(yàn)證規(guī)則:
驗(yàn)證規(guī)則名 | 含義 |
---|---|
require | 驗(yàn)證字段為必須 |
number | 驗(yàn)證字段是否為數(shù)字類型 |
integer | 驗(yàn)證字段是否為整數(shù) |
float | 驗(yàn)證字段是否為浮點(diǎn)型 |
boolean 或 bool | 驗(yàn)證字段是否為布爾值 |
驗(yàn)證字段是否符合郵箱格式 |
|
array | 驗(yàn)證字段是否為數(shù)組 |
date | 驗(yàn)證字段是否為有效的日期 |
alpha | 驗(yàn)證字段是否為純字母 |
alphaNum | 驗(yàn)證字段是否為字母 +數(shù)字 混合 |
alphaDash | 驗(yàn)證字段是否為字母 +數(shù)字 +_ +- 混合 |
chs | 驗(yàn)證字段是否為 漢字 |
chsAlpha | 驗(yàn)證字段是否為 漢字 +字母 混合 |
chsAlphaNum | 驗(yàn)證字段是否為 漢字 +字母 +數(shù)字 混合 |
chsDash | 驗(yàn)證字段是否為 漢字 +字母 +數(shù)字 +_ +- 混合 |
cntrl | 驗(yàn)證字段是否控制字符(換行、縮進(jìn)、空格) |
graph | 驗(yàn)證字段是否為可打印字符(空格除外) |
驗(yàn)證字段是否為可打印字符(包括空格) |
|
lower | 驗(yàn)證字段是否為小寫(xiě)字母 |
upper | 驗(yàn)證字段是否為大寫(xiě)字母 |
space | 驗(yàn)證字段是否為空白字符(包括縮進(jìn),垂直制表符,換行符,回車(chē)和換頁(yè)字符) |
xdigit | 驗(yàn)證字段是否為十六進(jìn)制字符串 |
url | 驗(yàn)證字段是否為有效的URL地址 |
ip | 驗(yàn)證字段是否為有效的IP地址 ,支持驗(yàn)證ipv4和ipv6格式的IP地址 |
dateFormat:format | 驗(yàn)證字段是否為指定格式的日期 ,如 dateFormat:y-m-d 表示年月日 |
mobile | 驗(yàn)證字段是否為有效的手機(jī)格式 |
idCard | 驗(yàn)證字段是否為有效的身份證格式 |
macAddr | 驗(yàn)證字段是否為有效的MAC地址 |
zip | 驗(yàn)證字段是否為有效的郵政編碼 |
in | 驗(yàn)證字段是否為是否在某個(gè)范圍 ,如 in:1,2,3 表示取值在 1,2,3 中 |
notIn | 驗(yàn)證字段是否為不在某個(gè)范圍 |
between | 驗(yàn)證字段是否為在某個(gè)區(qū)間 ,如 between:1,10 表示 1-10 之間 |
notBetween | 驗(yàn)證字段是否為不在某個(gè)范圍 |
length:num1,num2 | 驗(yàn)證字段是否為長(zhǎng)度是否在某個(gè)范圍 ,如 length:4,25 長(zhǎng)度在 4-25 ,length:4 表示指定長(zhǎng)度,如果驗(yàn)證的數(shù)據(jù)是數(shù)組,則判斷數(shù)組的長(zhǎng)度。如果驗(yàn)證的數(shù)據(jù)是File對(duì)象,則判斷文件的大小。 |
max:number | 驗(yàn)證字段的 最大長(zhǎng)度 ,如 max:10 表示最大長(zhǎng)度 10 ,注意不包含字段不存在的情況,如果驗(yàn)證的數(shù)據(jù)是數(shù)組,則判斷數(shù)組的長(zhǎng)度。如果驗(yàn)證的數(shù)據(jù)是File對(duì)象,則判斷文件的大小。 |
min:number | 驗(yàn)證字段的 最小長(zhǎng)度 ,如min:5 表示最小長(zhǎng)度 5 ,注意不包含字段不存在的情況,如果驗(yàn)證的數(shù)據(jù)是數(shù)組,則判斷數(shù)組的長(zhǎng)度。如果驗(yàn)證的數(shù)據(jù)是File對(duì)象,則判斷文件的大小。 |
after:日期 | 驗(yàn)證字段是否為在某個(gè)日期之后 ,如 after:2020-11-18 表示 2020-11-18 之后 |
before:日期 | 驗(yàn)證字段是否為在某個(gè)日期之前 ,如 after:2020-11-18 表示 2020-11-18 之前 |
expire:開(kāi)始時(shí)間,結(jié)束時(shí)間 | 驗(yàn)證當(dāng)前操作(注意不是某個(gè)值)是否在某個(gè)有效日期之內(nèi),如expire:2020-1-21,2020-5-1 表示 2020-01-21 至 2020-05-01 之間 |
allowIp:allow1,allow2,… | 驗(yàn)證當(dāng)前請(qǐng)求的IP 是否允許訪問(wèn),如 'allowIp:114.45.4.55' 表示ip為 114.45.4.55 |
denyIp:allow1,allow2,… | 驗(yàn)證當(dāng)前請(qǐng)求的IP 是否禁止訪問(wèn),如 denyIp:114.45.4.55 |
confirm | 驗(yàn)證字段是否為和另外一個(gè)字段值一致 ,如 confirm:new_value 表示當(dāng)前判斷字段值是否和 new_value 字段值一致 |
eq 或者 = 或者 same | 驗(yàn)證字段是否為等于某個(gè)值 ,如eq:100 表示等于 100 ,=:10 表示等于 10 ,same:20 表示等于 20 |
egt 或者 >= | 驗(yàn)證字段是否為大于等于某個(gè)值 ,如 egt:30 表示大于等于30 ,>=50 表示大于等于50 |
gt 或者 > | 驗(yàn)證字段是否為大于某個(gè)值 ,同上 |
elt 或者 <= | 驗(yàn)證字段是否為小于等于某個(gè)值 ,同上 |
lt 或者 < | 驗(yàn)證字段是否為小于某個(gè)值 |
file | 驗(yàn)證字段是否為一個(gè)上傳文件 |
image:width,height,type | 驗(yàn)證字段是否為一個(gè)圖像文件 ,其中 width,height和type都是可選,width和height必須同時(shí)定義 |
fileExt:允許的文件后綴 | 驗(yàn)證字段是否為上傳文件后綴 |
fileMime:允許的文件類型 | 驗(yàn)證字段是否為上傳文件類型 |
fileSize:允許的文件字節(jié)大小 | 驗(yàn)證字段是否為上傳文件大小 |
token:表單令牌名稱 | 表單令牌驗(yàn)證 |
unique:table,field,except,pk | 驗(yàn)證當(dāng)前請(qǐng)求的字段值是否為唯一的 |
requireIf:field,value | 驗(yàn)證某個(gè)字段的值等于某個(gè)值的時(shí)候必須 |
requireWith:field | 驗(yàn)證某個(gè)字段有值的時(shí)候必須 |
requireWithout:field | 驗(yàn)證某個(gè)字段沒(méi)有值的時(shí)候必須 |
requireCallback:callable | 驗(yàn)證當(dāng)某個(gè)callable為真的時(shí)候字段必須 |
9.小結(jié)
本小節(jié)主要介紹如何使用 ThinkPHP
提供的 Validate
驗(yàn)證器,它可以幫助快速有效地驗(yàn)證請(qǐng)求數(shù)據(jù)的有效性和正確性,另外還列舉了不同場(chǎng)景下內(nèi)置的字段驗(yàn)證規(guī)則,需要注意的是上面學(xué)生身份證號(hào)碼的驗(yàn)證可以使用 isCard
。
Tips: 代碼倉(cāng)庫(kù):https://gitee.com/love-for-poetry/tp6