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