EasySwoole 驗(yàn)證器組件
EasySwoole 提供了獨(dú)立的 驗(yàn)證器組件,幾行代碼即可實(shí)現(xiàn)對請求參數(shù)進(jìn)行驗(yàn)證。常用于對 HTTP 等請求中的請求參數(shù)的驗(yàn)證。
驗(yàn)證器 Validate 組件當(dāng)前最新版本為 2.0.0,相比舊版本 1.3.0 及之前版本支持了更強(qiáng)的驗(yàn)證規(guī)則,也允許用戶使用更多的自定義操作,更加方便用戶對請求參數(shù)進(jìn)行驗(yàn)證。關(guān)于組件舊版本 1.3.0 及更早版本的使用文檔請查看 Validate 1.3.x 文檔
另外框架還提供了在注解中對 HTTP 請求參數(shù)進(jìn)行校驗(yàn)的組件,可以很方便地對 HTTP 請求參數(shù)的合法性進(jìn)行校驗(yàn)。在注解中就可以設(shè)置請求參數(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 之前的版本請單獨(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)證錯誤信息提示
validate 驗(yàn)證器提供了默認(rèn)驗(yàn)證錯誤信息的規(guī)則,點(diǎn)擊查看 默認(rèn)驗(yàn)證錯誤信息的規(guī)則。
使用示例如下:
<?php
require_once __DIR__ . "/vendor/autoload.php";
// 要驗(yàn)證的數(shù)據(jù)
$data = [
'name' => 'easyswoole',
'age' => 19
];
// 初始化驗(yàn)證器對象
$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ī)則時的
添加字段的先后順序和驗(yàn)證規(guī)則的先后順序逐個進(jìn)行驗(yàn)證的,先添加的驗(yàn)證規(guī)則不通過則直接返回驗(yàn)證失敗,然后就可以獲取對應(yīng)的驗(yàn)證錯誤信息。例如上述示例中,會優(yōu)先驗(yàn)證name字段是否存在。下面示例也是一樣的原理。
使用自定義的驗(yàn)證錯誤信息提示
使用示例如下:
<?php
require_once __DIR__ . "/vendor/autoload.php";
// 要驗(yàn)證的數(shù)據(jù)
$data = [
'name' => 'easyswoole',
'age' => 16
];
// 初始化驗(yàn)證器對象
$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 個 \EasySwoole\Spl\SplArray 對象
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 第一個參數(shù)為類,第二個參數(shù)設(shè)置是否覆蓋 (當(dāng)存在相同名字的驗(yàn)證規(guī)則,傳參數(shù) true 會替換掉前面設(shè)置的同名的驗(yàn)證規(guī)則)
$validate->addFunction(new CustomValidator(), false);
// 自定義錯誤消息示例
$validate->addColumn('mobile')->required('手機(jī)號不能為空')->callUserRule(new CustomValidator(), '手機(jī)號格式不正確');
// 驗(yàn)證結(jié)果
$bool = $validate->validate($data);
if ($bool) {
var_dump("驗(yàn)證通過");
} else {
var_dump($validate->getError()->__toString());
}
/*
* 輸出結(jié)果:string(24) "手機(jī)號格式不正確"
*/
特殊驗(yàn)證
使用帶 * 號的匹配規(guī)則進(jìn)行驗(yàn)證
使用示例如下:
<?php
require_once __DIR__ . "/vendor/autoload.php";
$validate = new \EasySwoole\Validate\Validate();
// * 可以放在任意位置 且有多個
$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自定義錯誤信息. -
$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)證錯誤消息提示
$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ī)則列表