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