EasySwoole 驗(yàn)證器組件
EasySwoole
提供了獨(dú)立的 驗(yàn)證器組件
,幾行代碼即可實(shí)現(xiàn)對(duì)請(qǐng)求參數(shù)進(jìn)行驗(yàn)證。常用于對(duì) HTTP
等請(qǐng)求中的請(qǐng)求參數(shù)的驗(yàn)證。
驗(yàn)證器 Validate
組件當(dāng)前最新版本為 2.0.0
,相比舊版本 1.3.0
及之前版本支持了更強(qiáng)的驗(yàn)證規(guī)則,也允許用戶使用更多的自定義操作,更加方便用戶對(duì)請(qǐng)求參數(shù)進(jìn)行驗(yàn)證。關(guān)于組件舊版本 1.3.0
及更早版本的使用文檔請(qǐng)查看 Validate 1.3.x 文檔
另外框架還提供了在注解中對(duì) HTTP
請(qǐng)求參數(shù)進(jìn)行校驗(yàn)的組件,可以很方便地對(duì) HTTP
請(qǐng)求參數(shù)的合法性進(jìn)行校驗(yàn)。在注解中就可以設(shè)置請(qǐng)求參數(shù)的驗(yàn)證規(guī)則,使得代碼更簡潔,詳細(xì)使用見 參數(shù)注解校驗(yàn)。
組件要求
- php: >= 7.1.0
- easyswoole/spl: ^1.0
- psr/http-message: ^1.0
- ext-json: *
- ext-mbstring: *
安裝方法
框架 3.4.x
及以上版本自帶 validate
組件,所以不需要單獨(dú)安裝。3.4.x
之前的版本請(qǐng)單獨(dú)安裝,安裝方法如下:
composer require easyswoole/validate
倉庫地址
基本使用
普通驗(yàn)證
支持的驗(yàn)證方法
普通驗(yàn)證支持的驗(yàn)證方法有如下:activeUrl
、allDigital
、allowFile
、allowFileType
、alpha
、alphaDash
、alphaNum
、between
、betweenLen
、bool
、dateAfter
、dateBefore
、decimal
、different
、differentWithColumn
、equal
、equalWithColumn
、float
、func
、greaterThanWithColumn
、inArray
、integer
、isArray
、isIp
、length
、lengthMax
、lengthMin
、lessThanWithColumn
、max
、min
、url
、money
、notEmpty
、notInArray
、numeric
、optional
、regex
、required
、timestampAfter
、timestampAfterDate
、timestampBefore
、timestampBeforeDate
、url
。
驗(yàn)證方法的具體使用可查看 方法列表
使用組件提供的默認(rèn)的驗(yàn)證錯(cuò)誤信息提示
validate
驗(yàn)證器提供了默認(rèn)驗(yàn)證錯(cuò)誤信息的規(guī)則,點(diǎn)擊查看 默認(rèn)驗(yàn)證錯(cuò)誤信息的規(guī)則。
使用示例如下:
<?php
require_once __DIR__ . "/vendor/autoload.php";
// 要驗(yàn)證的數(shù)據(jù)
$data = [
'name' => 'easyswoole',
'age' => 19
];
// 初始化驗(yàn)證器對(duì)象
$validate = new \EasySwoole\Validate\Validate();
// 給字段加上驗(yàn)證規(guī)則 (驗(yàn)證數(shù)據(jù)中 name 字段不能沒有)
$validate->addColumn('name')->required();
// 給字段加上驗(yàn)證規(guī)則 (驗(yàn)證數(shù)據(jù)中 age 字段不能沒有且值不能大于18)
$validate->addColumn('age')->required()->max(18);
// 驗(yàn)證結(jié)果:驗(yàn)證通過返回 true 反之返回 false
$bool = $validate->validate($data);
if ($bool) {
var_dump("驗(yàn)證通過");
} else {
var_dump($validate->getError()->__toString());
}
/*
* 輸出結(jié)果:string(23) "age的值不能大于18"
*/
注意:驗(yàn)證器組件的驗(yàn)證順序是按照添加驗(yàn)證規(guī)則時(shí)的
添加字段的先后順序
和驗(yàn)證規(guī)則的先后順序
逐個(gè)進(jìn)行驗(yàn)證的,先添加的驗(yàn)證規(guī)則不通過則直接返回驗(yàn)證失敗,然后就可以獲取對(duì)應(yīng)的驗(yàn)證錯(cuò)誤信息。例如上述示例中,會(huì)優(yōu)先驗(yàn)證name
字段是否存在。下面示例也是一樣的原理。
使用自定義的驗(yàn)證錯(cuò)誤信息提示
使用示例如下:
<?php
require_once __DIR__ . "/vendor/autoload.php";
// 要驗(yàn)證的數(shù)據(jù)
$data = [
'name' => 'easyswoole',
'age' => 16
];
// 初始化驗(yàn)證器對(duì)象
$validate = new \EasySwoole\Validate\Validate();
// 給字段加上驗(yàn)證規(guī)則 (驗(yàn)證數(shù)據(jù)中 name 字段不能沒有)
$validate->addColumn('name')->required('名字不為空');
// 給字段加上驗(yàn)證規(guī)則
$validate->addColumn('age')->required('年齡不為空')->func(function ($itemData, $column, \EasySwoole\Validate\Validate $validate) {
// 獲取要驗(yàn)證的數(shù)據(jù),為 1 個(gè) \EasySwoole\Spl\SplArray 對(duì)象
var_dump($validate->getVerifyData());
// 判斷要驗(yàn)證的數(shù)據(jù)是否屬于 \EasySwoole\Spl\SplArray
var_dump($validate->getVerifyData() instanceof \EasySwoole\Spl\SplArray);
// 獲取驗(yàn)證的字段名,為 'age',即 addColumn() 中設(shè)置的字段名
var_dump($column);
// 獲取驗(yàn)證的字段名的值,為 18
var_dump($itemData);
return ($validate->getVerifyData() instanceof \EasySwoole\Spl\SplArray) && $column === 'age' && $itemData === 0.001;
}, '只允許18歲的進(jìn)入');
// 驗(yàn)證結(jié)果:驗(yàn)證通過返回 true 反之返回 false
$bool = $validate->validate($data);
if ($bool) {
var_dump("驗(yàn)證通過");
} else {
var_dump($validate->getError()->__toString());
}
/*
* 輸出結(jié)果:string(23) "只允許18歲的進(jìn)入"
*/
自定義驗(yàn)證
使用自定義驗(yàn)證器類的自定義驗(yàn)證規(guī)則
使用示例如下:
<?php
require_once __DIR__ . "/vendor/autoload.php";
class CustomValidator extends \EasySwoole\Validate\Functions\AbstractValidateFunction
{
/**
* 返回當(dāng)前校驗(yàn)規(guī)則的名字
*/
public function name(): string
{
return 'mobile';
}
/**
* 驗(yàn)證失敗返回 false,或者用戶可以拋出異常,驗(yàn)證成功返回 true
* @param $itemData
* @param $arg
* @param $column
* @return bool
*/
public function validate($itemData, $arg, $column, \EasySwoole\Validate\Validate $validate): bool
{
$regular = '/^((13[0-9])|(14[5,7,9])|(15[^4])|(18[0-9])|(17[0,1,3,5,6,7,8]))\\d{8}$/';
if (!preg_match($regular, $itemData)) {
return false;
}
return true;
}
}
// 待驗(yàn)證數(shù)據(jù)
$data = [
'mobile' => '12312345678'
];
$validate = new \EasySwoole\Validate\Validate();
// 先添加 function 第一個(gè)參數(shù)為類,第二個(gè)參數(shù)設(shè)置是否覆蓋 (當(dāng)存在相同名字的驗(yàn)證規(guī)則,傳參數(shù) true 會(huì)替換掉前面設(shè)置的同名的驗(yàn)證規(guī)則)
$validate->addFunction(new CustomValidator(), false);
// 自定義錯(cuò)誤消息示例
$validate->addColumn('mobile')->required('手機(jī)號(hào)不能為空')->callUserRule(new CustomValidator(), '手機(jī)號(hào)格式不正確');
// 驗(yàn)證結(jié)果
$bool = $validate->validate($data);
if ($bool) {
var_dump("驗(yàn)證通過");
} else {
var_dump($validate->getError()->__toString());
}
/*
* 輸出結(jié)果:string(24) "手機(jī)號(hào)格式不正確"
*/
特殊驗(yàn)證
使用帶 * 號(hào)的匹配規(guī)則進(jìn)行驗(yàn)證
使用示例如下:
<?php
require_once __DIR__ . "/vendor/autoload.php";
$validate = new \EasySwoole\Validate\Validate();
// * 可以放在任意位置 且有多個(gè)
$validate->addColumn('*.a')->required()->notEmpty()->between(1, 10);
// 驗(yàn)證結(jié)果
$bool = $validate->validate([
'a' => ['a' => 1],
'b' => ['a' => 11]
]);
if ($bool) {
var_dump("驗(yàn)證通過");
} else {
var_dump($validate->getError()->__toString());
}
/*
* 輸出結(jié)果:*.a只能在 1 - 10 之間
*/
快速驗(yàn)證
我們還提供了數(shù)組快速驗(yàn)證方式。
函數(shù)原型:EasySwoole\Validate\Validate::make()
:
參數(shù):
-
$rules
驗(yàn)證規(guī)則. -
$message
自定義錯(cuò)誤信息. -
$alias
字段別名.
返回值:
-
\EasySwoole\Validate\Validate::class
實(shí)例.
使用示例如下:
<?php
require_once __DIR__ . "/vendor/autoload.php";
// 驗(yàn)證規(guī)則
$rules = [
'name' => 'required|notEmpty',
'age' => 'required|integer|between:20,30',
'weight' => 'required|max:50'
];
// 驗(yàn)證錯(cuò)誤消息提示
$messages = [
'name.required' => '名字不能為空!',
'age' => '年齡輸入有誤!',
'weight.max' => '體重最大不能超過50!'
];
// 驗(yàn)證字段的別名
$alias = [
'name' => '名字',
'age' => '年齡',
'weight' => '體重'
];
// 組裝快速驗(yàn)證
$validate = \EasySwoole\Validate\Validate::make($rules, $messages, $alias);
// 驗(yàn)證結(jié)果
$bool = $validate->validate([
'name' => '史迪仔',
'age' => 20,
'weight' => 70
]);
if ($bool) {
var_dump("驗(yàn)證通過");
} else {
var_dump($validate->getError()->__toString());
}
/*
* 輸出結(jié)果:weight的值不能大于'50'
*/
暫不支持
inArray
、notInArray
、func
、callUserRule
、allowFile
、allowFileType
等規(guī)則。
其他的具體的驗(yàn)證規(guī)則,可查看 驗(yàn)證規(guī)則列表