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