請求參數(shù)校驗
1.前言
本小節(jié)主要介紹如何使用 ThinkPHP 提供的 Validate 驗證器,它可以在控制器接收參數(shù)之前驗證參數(shù),若參數(shù)不合符業(yè)務(wù)要求,就會返回相應(yīng)的錯誤提示,在實際工作中,數(shù)據(jù)校驗的是一項必不可少的工作,數(shù)據(jù)的嚴格校驗可能減少很多不必要的代碼執(zhí)行,這從某種層面來說減少了服務(wù)器壓力,從安全角度來說,數(shù)據(jù)校驗?zāi)鼙苊饽承┎槐匾?BUG,比如對手機號碼的校驗,能有效地阻止后期發(fā)送短信失敗導(dǎo)致的 BUG能有效地防止 XSS、SQL注入等攻擊。
2.新建驗證器類
這里以之前添加學(xué)生接口為例,該接口入?yún)⑿枰?學(xué)生姓名(name)、年齡(age)、身份證號(id_number),首先新建一個 app\Validate 目錄,然后在該目錄下新建一個 StudentValidate 類,代碼如下:
<?php
namespace app\Validate;
use think\Validate;
class StudentValidate extends Validate
{
}
如下圖所示:

3.設(shè)置字段驗證規(guī)則
字段的驗證規(guī)則可以在 protected $rule 中設(shè)置如下規(guī)則:
/**
* 設(shè)置字段驗證規(guī)則
* @var string[]
*/
protected $rule = [
'name' => 'require|max:5',
'age' => 'number|between:1,120',
'id_number' => 'require|in:18',
];
如下圖所示:

4.設(shè)置不滿足規(guī)則的提示語
若想要設(shè)置不滿足驗證規(guī)則字段的錯誤提示語,可在 protected $message 中設(shè)置如下內(nèi)容:
/**
* 設(shè)置不滿足字段要求的提示語
* @var string[]
*/
protected $message = [
'name.require' => '學(xué)生姓名不能為空',
'name.max' => '學(xué)生姓名長度不能超過5',
'age.number' => '學(xué)生年齡必須是數(shù)字',
'age.between' => '學(xué)生年齡值必須是1-120之間',
'id_number.require' => '學(xué)生身份證號不能為空',
'id_number.in' => '學(xué)生身份證號必須是18位'
];
如下圖所示:

5.設(shè)置驗證場景
若想要在不同場景下驗證不同的字段,可在 protected $scene 總設(shè)置如下內(nèi)容:
/**
* 設(shè)置驗證場景
* @var string[][]
*/
protected $scene = [
'add-student' => ['name', 'age', 'id_number'],
'edit-student' => ['name', 'age']
];
如下圖所示:

6.在控制器中調(diào)用驗證器
可以在學(xué)生添加接口的控制器中增加如下內(nèi)容:
validate(StudentValidate::class)->scene('add-student')->check($this->request->param());
如下圖所示:

Tips: 其中
validate()是一個框架提供的一個輔助函數(shù),scene('add-student')表示驗證場景是add-student,$this->request->param()表示接口傳入的參數(shù)。
7.請求接口驗證
在 postman 中請求上述接口,如下圖是缺少學(xué)生 name 字段提示的錯誤:

學(xué)生 name 字段超過長度提示如下:

8.內(nèi)置驗證規(guī)則表
下面列出 ThinkPHP 提供的內(nèi)置驗證規(guī)則:
| 驗證規(guī)則名 | 含義 |
|---|---|
| require | 驗證字段為必須 |
| number | 驗證字段是否為數(shù)字類型 |
| integer | 驗證字段是否為整數(shù) |
| float | 驗證字段是否為浮點型 |
| boolean 或 bool | 驗證字段是否為布爾值 |
驗證字段是否符合郵箱格式 |
|
| array | 驗證字段是否為數(shù)組 |
| date | 驗證字段是否為有效的日期 |
| alpha | 驗證字段是否為純字母 |
| alphaNum | 驗證字段是否為字母+數(shù)字混合 |
| alphaDash | 驗證字段是否為字母+數(shù)字+_+-混合 |
| chs | 驗證字段是否為 漢字 |
| chsAlpha | 驗證字段是否為 漢字+字母混合 |
| chsAlphaNum | 驗證字段是否為 漢字+字母+數(shù)字混合 |
| chsDash | 驗證字段是否為 漢字+字母+數(shù)字+_+-混合 |
| 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 表示指定長度,如果驗證的數(shù)據(jù)是數(shù)組,則判斷數(shù)組的長度。如果驗證的數(shù)據(jù)是File對象,則判斷文件的大小。 |
| max:number | 驗證字段的 最大長度,如 max:10 表示最大長度 10,注意不包含字段不存在的情況,如果驗證的數(shù)據(jù)是數(shù)組,則判斷數(shù)組的長度。如果驗證的數(shù)據(jù)是File對象,則判斷文件的大小。 |
| min:number | 驗證字段的 最小長度,如min:5 表示最小長度 5,注意不包含字段不存在的情況,如果驗證的數(shù)據(jù)是數(shù)組,則判斷數(shù)組的長度。如果驗證的數(shù)據(jù)是File對象,則判斷文件的大小。 |
| after:日期 | 驗證字段是否為在某個日期之后,如 after:2020-11-18 表示 2020-11-18 之后 |
| before:日期 | 驗證字段是否為在某個日期之前,如 after:2020-11-18 表示 2020-11-18 之前 |
| expire:開始時間,結(jié)束時間 | 驗證當前操作(注意不是某個值)是否在某個有效日期之內(nèi),如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é)
本小節(jié)主要介紹如何使用 ThinkPHP 提供的 Validate 驗證器,它可以幫助快速有效地驗證請求數(shù)據(jù)的有效性和正確性,另外還列舉了不同場景下內(nèi)置的字段驗證規(guī)則,需要注意的是上面學(xué)生身份證號碼的驗證可以使用 isCard。
Tips: 代碼倉庫:https://gitee.com/love-for-poetry/tp6
愛因詩賢 ·
2025 imooc.com All Rights Reserved |