ThinkPHP6.0學習筆記-驗證器
驗證器
By:Mirror王宇陽
驗證器定義
驗證器的使用,必須定義它;系統提供了一條命令直接生產一個驗證器類:
php think make:validate User
自動再應用目錄下生成一個
validate
資料夾,並生成User.php
類
namespace app\validate; use think\Validate; class User extends Validate { /** * 定義驗證規則 * 格式:'欄位名' => ['規則1','規則2'...] * '欄位名' => '規則1|規則2...' * * @var array */ protected $rule = [ 'name' => 'require|max:20', 'price' => 'number|between:1,100', 'email' => 'email' ]; /** * 定義錯誤資訊 * 格式:'欄位名.規則名' => '錯誤資訊' * * @var array */ protected $message = [ 'name.require' => '姓名不得為空', 'name.max' => '姓名不得大於20位', 'price.number' => '價格必須是數字', 'price.between' => '價格位於1~100之間', 'email' => '郵箱格式錯誤' ]; }
自動生成的兩個屬性:
$rule
:定義規則
$message
:定義錯誤資訊 ,如果不定義錯誤資訊提示預設的錯誤資訊
驗證器定義之後,進行呼叫測試,建立一個Verify.php
控制器:
namespace app\controller; use app\validate\User; use think\exception\ValidateException; class Verify { public function index() { try { validate(User::class)->check([ 'name' => '蠟筆小新', 'price' => 90, 'email' => '[email protected]' ]); } catch (ValidateException $err){ dump($err->getError()); } } }
當驗證規則出現一個錯誤後就會停止之後欄位的判斷
批量驗證
class Verify { public function index() { try { $result = validate(User::class) ->batch(true)->check([ 'name' => '蠟筆小新', 'price' => 90, 'email' => '[email protected]' ]); if(true !== $result){ dump($result); } } catch (ValidateException $err){ dump($err->getError()); } } }
自定義規則
系統內建提供了部分常用的規則;同時也允許開發者自定義規則:
protected function checkName($value,$rule)
{
return $rule != $value ? true : '存在非法字元';
}
自定義規則支援傳入五個引數:
- 驗證資料
- 驗證規則
- 全部資料(陣列)
- 欄位名
- 欄位描述
驗證規則
規則定義
protected $rule = [
'name' => 'require|max:20',
'price' => 'number|between:1,100',
'email' => 'email'
];
不僅僅支援字串模式,也支援陣列模式
protected $rule = [
'name' => [
'require',
'max' => 10
],
'price' => [
'number',
'between' => '1,100'
],
'email' => ['email']
];
陣列模式是在規則複雜的時候使用
獨立驗證:
上述的各種驗證規則都需要呼叫
validate
目錄下的驗證器檔案,而Think支援在控制器檔案下獨立驗證;這種不依賴驗證器檔案的呼叫方式是一種獨立、唯一的呼叫方式
namespace app\controller;
use think\facade\Validate;
class Verify
{
public function index()
{
$validate = Validate::rule([
'name' => 'require|max:20',
'price' => 'number|between:1,100',
'email' => 'email'
]);
$result = $validate->chech([
'name' => '蠟筆小新',
'price' => 90,
'email' => '[email protected]'
]);
if (!$result){
dump($validate->getError());
}
}
}
獨立驗證支援物件化的定義方式,但不支援屬性方法的定義:
namespace app\controller; use think\facade\Validate; use think\facade\ValidateRule as Rule; class Verify { public function index() { $validate = Validate::rule([ 'name' => 'Rule::isRequire()->max(20)', 'price' => 'Rule::isNumber()->between([1,100])', 'email' => 'Rule::isEmail()' ]); $result = $validate->chech([ 'name' => '蠟筆小新', 'price' => 90, 'email' => '[email protected]' ]); if (!$result){ dump($validate->getError()); } } }
獨立驗證支援閉包自定義方法:(不支援欄位多規則)
$validate = Validate::rule([
'name'=> function($value){
return $value != '' ? true : '姓名不得為空';
},
'price'=> function($value){
return $value > 0 ? true:'不得低於零';
}
]);
錯誤資訊
單獨定義提示資訊
在驗證器類中定義message
屬性:
protected $message = [
'name.require' => '姓名不得為空',
'name.max' => '姓名不得大於20位',
'price.number' => '價格必須是數字',
'price.between' => '價格位於1~100之間',
'email' => '郵箱格式錯誤'
];
錯誤資訊支援陣列定義,並通過JSON方式交給前端
protected $message = [
'name.require' => ['code' => 1001, 'msg' => '名稱必須'],
'name.max' => ['code' => 1002, 'msg' => '名稱最多不能超過25個字元'],
'age.number' => ['code' => 1003, 'msg' => '年齡必須是數字'],
'age.between' => ['code' => 1004, 'msg' => '年齡必須在1~120之間'],
'email' => ['code' => 1005, 'msg' =>'郵箱格式錯誤'],
];
獨立驗證定義錯誤提示
ValidateRule::isEmail(null,'格式不正確')
引數一:驗證規則
引數二:自定義錯誤提示
也可以獨立使用
message()
方法:Validate->[……]->message([……])
驗證場景
驗證場景設定:即特定的場景寫是否進行驗證,獨立驗證不存在場景驗證;
新增資料需要驗證郵箱資訊,而修改資料不需要驗證郵箱資訊
namespace app\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'name' => 'require|max:20',
'price' => 'number|between:1,100',
'email' => 'email'
];
protected $message = [
'name.require' => '姓名不得為空',
'name.max' => '姓名不得大於20位',
'price.number' => '價格必須是數字',
'price.between' => '價格位於1~100之間',
'email' => '郵箱格式錯誤'
];
protected $scene = [
// 新增資料驗證三個欄位
'insert' => ['name','price','email'],
// 更新資料驗證兩個欄位
'edit' => ['name','price']
];
}
try {
validate(User::class)->scene('edit')->check([
'name' => '蠟筆小新',
'price' => 90,
'email' => 'xiaoxinqq.com'
]);
} catch (ValidateException $err){
dump($err->getError());
}
在控制端設定
scene()
就成功的限制只驗證name
和price
兩個欄位
scene
支援為單個場景單獨定義方法,方法的命名規範是scene+場景名
,採用駝峰寫法;
同時在驗證類中支援公共方法對場景中的細節進行定義:
public function sceneEdit()
{
return $this->only(['name','price'])
->append('name','min:5')
->remove('price','between')
->append('price','require|max:20');
}
append
追加
remove
移除(不要對一個欄位多次操作,會導致覆蓋;可以同時操作)
only
約束欄位
路由驗證
路由驗證:在路由引數呼叫驗證類進行驗證
protected $rule = [
'id' => 'number|between:1,10'
];
protected $message = [
'id.between' => 'id介於1~10之間',
'id.number' => 'id必須是數字'
];
protected $scene = [
'route' => ['id'];
];
Route::rule('vr/:id','Verify/route')->validate(User::class,'route');//只執行route場景
也支援使用獨立的驗證方式,這裡不贅述……
內建規則
《ThinkPHP6.0開發手冊-內建規則》
靜態方法支援兩種形式:::number()
、isNumber()
方法驗證
格式驗證類
屬性/方法 | 描述 |
---|---|
require /::isRequire |
不得為空 |
number /::isNumber |
驗證欄位是否為純數字 |
integer /::isInteger |
驗證欄位是否為整數 |
float /::isFloat |
驗證欄位是否為浮點數 |
boolean /::isBoolean |
驗證欄位是否為布林值 |
email /::isEmail |
驗證欄位是否為郵箱格式 |
array /isArray |
驗證欄位是否為陣列 |
accepted /isAccepted |
驗證欄位是否為yes/on |
date /isDate |
驗證欄位是否為有效日期 |
alpha /isAlpha |
驗證欄位是否為純字母 |
alphaNum /isAlphaNum |
驗證欄位是否為純字母數字組合 |
alphaDash /isAlphaDash |
驗證欄位是否為字母數字下劃線破折號組好 |
chs /isChs |
驗證欄位是否為漢字 |
chsAlpha /isChsAlpha |
驗證欄位是否為漢字字母 |
chsAlphaNum /isChsAlphaNum |
驗證欄位是否為漢字字母和數字 |
chsDash /isChsDash |
驗證欄位是否為字母數字下劃線破折號組好和漢字 |
cntrl /isCntrl |
驗證欄位是否為控制字元(空格、縮排) |
graph /isGraph |
驗證欄位是否為可列印字元(不包括空格) |
print /isPrint |
驗證欄位是否為可列印字元(包括空格) |
lower /isLower |
驗證欄位是否為小寫 |
upper /isUpper |
驗證欄位是否為大寫 |
space /isSpace |
驗證欄位是否為空白字元 |
xdigit /isXdigit |
驗證欄位是否為十六進位制 |
activeUrl /isActiveUrl |
驗證欄位是否為有效域名 |
url /isUrl |
驗證欄位是否為有效URL地址 |
ip /isIp |
驗證欄位是否為有效IP地址 |
deteFormat:format |
驗證欄位的日期時間格式 |
mobile |
驗證欄位是否為有效手機號 |
idCard |
驗證身份證格式 |
macAddr |
驗證MAC地址格式 |
zip |
驗證有效郵政編碼 |
長度和區間驗證類
屬性 | 描述 |
---|---|
in |
驗證欄位是否在某個範圍 |
notIn |
驗證欄位是否不再某個範圍 |
between |
驗證欄位是否在某個區間 |
notBetween |
驗證欄位是否不在某個區間 |
length |
驗證長度是否在某個範圍或指定長度 |
max /min |
驗證最大/最小長度(大小) |
after |
驗證是否在某個日期之後 |
before |
驗證是否在某個日期之前 |
expire |
驗證當前值是否在某個時間區間內 |
allowip |
驗證當前值是否在某個IP段範圍內 |
denyIp |
驗證當前值IP是否為禁止訪問的IP |
欄位比較類
屬性 | 描述 |
---|---|
confirm:field |
驗證欄位的值是否和其它的值一致 |
different:field |
驗證欄位的值是否和其它的值不一致 |
eq /same /= |
驗證是否等於某個值 |
egt / >= |
驗證是否大於等於某個值 |
gt /> |
驗證是否大於某個值 |
elt /<= |
驗證是否小於等於某個值 |
lt /< |
驗證是否小於某個值 |
上傳驗證類
屬性 | 描述 |
---|---|
file |
驗證上傳的是否是一個檔案 |
image |
驗證是否是一個影象檔案(可以約束width height type) |
fileExt |
驗證檔案字尾(可以允許字尾名單) |
fileMime |
驗證檔案型別(可以允許檔案型別) |
fileSize |
驗證檔案大小(可以允許的位元組大小) |
其他驗證類
filter驗證:
支援使用filter_var
進行驗證,例如:
'ip'=>'filter:validate_ip'
正則驗證:regex
支援使用正則表示式進行驗證:
'data' => '\d{6}';
'data' => 'regex:\d{6}';
若表示式中包含或邏輯,需要使用陣列方式定義
'data' => ['regex'=>'/^(yes|on|1)$/i']
同時也可以預定義
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
protected $regex = [ 'zip' => '\d{6}'];
protected $rule = [
'name' => 'require|max:25',
'email' => 'email',
];
}
然後就可以使用
'zip' => 'regex:zip',
表單令牌驗證:token
參考連線:https://www.kancloud.cn/manual/thinkphp6_0/1037632
驗證請求欄位唯一:unique
可以驗證當前請求的欄位值是否為唯一的
unique:[table],[field],[except],[pk]
table:指定資料表
field:其他欄位
except:排除某個主鍵值
pk:指定某個主鍵值排除
// 表示驗證name欄位的值是否在user表(不包含字首)中唯一
'name' => 'unique:user',
// 驗證其他欄位
'name' => 'unique:user,account',
// 排除某個主鍵值
'name' => 'unique:user,account,10',
// 指定某個主鍵值排除
'name' => 'unique:user,account,10,user_id',
require:
屬性 | 描述 |
---|---|
requireIf:field,value |
驗證某個欄位的值等於某個值的時候必須 |
requireWith:field |
驗證某個欄位有值的時候必須 |
requireWithout:field |
驗證某個欄位沒有值的時候必須 |
requireCallback:callable |
驗證當某個callable為真時候欄位必須 |
靜態呼叫驗證
靜態呼叫:使用facade模式進行呼叫驗證,適合驗證單個數據
引入facade中的Validate
時候可能會發生衝突,需要留意;
dump(Validate::isEmail('[email protected]'));
靜態呼叫支援多規則驗證:checkRule()
Validate::checkRule(10, 'number|between:1,10');
註解驗證
參考官方:https://www.kancloud.cn/manual/thinkphp6_0/1375936
安裝額外的擴充套件:
composer require topthink/think-annotation