用於對API接口的請求參數進行合法性檢查。git
在實現服務端的API接口時,對於每個接口的每個參數,都應該檢測其取值是否合法,以避免錯誤的數據輸入到系統中。這個工做能夠說是費時費力,但又不得不作。並且PHP自己是弱類型語言,不但要驗證取值,還要驗證數據的類型是否符合,這就更復雜了。github
本工具就是針對這個工做而設計的,可以有效地減小編碼量,代碼可讀性好。web
看看下面這段代碼,能夠對用法有個大概印象,應該不難看懂:正則表達式
$params = $request->query(); // 獲取GET參數
// 驗證(若是驗證不經過,會拋出異常)
Validation::validate($params, [
"offset" => "IntGe:0",
"count" => "Required|IntGeLe:1,200",
]);
複製代碼
支持多種數據類型的校驗:整型、浮點型、bool型、字符串、數組、對象、文件、日期時間,可以驗證嵌套的數據結構中的參數,還支持帶條件判斷的驗證。數組
我在使用Laravel框架的時候,Laravel提供了一個參數驗證工具,不過用起來不怎麼順暢:bash
size
驗證器,它同時支持驗證字符串、整型、文件等多種類型的參數,針對不一樣數據類型size
的含義不同。這就比如你去背英語單詞,有那麼一些英語單詞,它有不少不少意思,不一樣的語境下有不一樣的含義。好比"present"這個單詞,它既有「呈現」、「出席」的意思,也有「禮物」的意思。這種一詞多義的單詞最讓人頭疼了,搞不清它到底什麼意思,並且記不住啊。爲了解決這些問題,因此才寫了這麼一個工具。數據結構
Regexp
, Ip
, Email
, Url
等。下面這個示例展現了一個查詢獲取用戶投訴列表的Request參數的驗證(用到了條件驗證和針對嵌套數據結構的驗證):composer
//驗證規則
$validations = [
"offset" => "IntGe:0", // 參數offset應該大於等於0
"count" => "Required|IntGeLe:1,200", // 參數count是必需的且大於等於1小於等於200
"type" => "IntIn:1,2", // 參數type可取值爲: 1, 2
"state" => [
'IfIntEq:type,1|IntEq:0', // 若是type==1(批評建議),那麼參數state只能是0
'IfIntEq:type,2|IntIn:0,1,2', // 若是type==2(用戶投訴),那麼參數state可取值爲: 1, 2, 3
],
"search.keyword" => "StrLenGeLe:1,100", // search.keyword 應該是一個長度在[1, 100]之間的字符串
"search.start_time" => "Date", // search.start_time 應該是一個包含合法日期的字符串
"search.end_time" => "BoolSmart", // search.end_time 應該是一個包含合法日期的字符串
];
// 待驗證參數
$params = [
"offset" => 0, // 從第0條記錄開始
"count" => 10, // 最多返回10條記錄
"type" => 2, // 1-批評建議, 2-用戶投訴
"state" => 0, // 0-待處理, 1-處理中, 2-已處理
"search" => [ // 搜索條件
"keyword" => '硬件故障', // 關鍵字
"start_time" => "2018-01-01", // 起始日期
"end_time" => "2018-01-31", // 結束日期
],
];
// 驗證(若是驗證不經過,會拋出異常)
Validation::validate($params, $validations);
複製代碼
經過Composer安裝框架
composer require webgeeker/validation:^0.4
複製代碼
這個例子直接驗證$_POST
(POST表單)中的參數,展現了最基本的用法
<?php
include "vendor/autoload.php";
use WebGeeker\Validation\Validation;
try {
Validation::validate($_POST, [
"offset" => "IntGe:0", // 參數offset應該大於等於0
"count" => "Required|IntGeLe:1,200", // 參數count是必需的且大於等於1小於等於200
]);
} catch (\Exception $e) {
echo $e->getMessage();
}
複製代碼
注意:驗證不經過會拋出異常,該異常中包含有錯誤描述信息
若是驗證不經過,Validation::validate(...)
方法會拋出異常,建議在框架層面統一捕獲這些異常,提取錯誤描述信息並返回給客戶端。
第三方框架通常會提供Request對象,能夠取到GET, POST參數(以Laravel爲例)
//$params = $request->query(); // 獲取GET參數
$params = $request->request->all(); // 獲取POST參數
// 驗證(若是驗證不經過,會拋出異常)
Validation::validate($params, [
// 此處省略驗證規則
]);
複製代碼
整型驗證器所有以"Int"開頭,用於驗證整型數值(如123
)或整型字符串(如"123"
)。其它數據類型均不匹配。
"size" => "IntGeLe:1,100"
複製代碼
這條驗證要求參數"size"是整數,而且大於等於1,小於等於100。
完整的整型驗證器的列表參考附錄 A.1 。
浮點型驗證器所有以"Float"開頭,用於驗證浮點型數值(如1.0
)、浮點型字符串(如"1.0"
)、整型數值(如123
)或整型字符串(如"123"
)。其它數據類型均不匹配。
"height" => "FloatGeLe:0.0,100.0"
複製代碼
這條驗證要求參數"height"是浮點數,而且大於等於0,小於等於100.0。
完整的浮點型驗證器的列表參考附錄 A.2 。
bool型驗證器只有兩個:
true
, false
, "true"
, "false"
(字符串忽略大小寫)。true
, false
, "true"
, "false"
, 1
, 0
, "1"
, "0"
, "yes"
, "no"
, "y"
, "n"
(字符串忽略大小寫)例
"accept" => "BoolSmart"
複製代碼
完整的bool型驗證器的列表參考附錄 A.3 。
字符串型驗證器不全以"Str"開頭。只接收字符串型數據,其它數據類型均不匹配。
例1:
"name" => "StrLenGeLe:2,20"
複製代碼
這條驗證要求參數"name"是字符串,長度在2-20之間(字符串長度是用mb_strlen()
來計算的)。
例2:
"comment" => "ByteLenLe:1048576"
複製代碼
這條驗證要求參數"comment"是字符串,字節長度不超過1048576(字節長度是用strlen()
來計算的)。
例3:
"email" => "Email"
複製代碼
這條驗證要求參數"email"是必須是合法的電子郵件地址。
例4(正則表達式驗證):
"phone" => "Regexp:/^1(3[0-9]|4[579]|5[0-35-9]|7[0135678]|8[0-9]|66|9[89])\d{8}$/"
複製代碼
這條驗證要求參數"phone"是合法的手機號。
關於正則表達式中的哪些特殊字符須要轉義的問題,只須要用 preg_match()
函數驗證好,如:
preg_match('/^string$/', $string);
複製代碼
而後把兩個'/'
號及其中間的部分拷貝出來,放在Regexp:
後面便可,不須要再作額外的轉義,即便正則中有'|'
這種特殊符號,也不須要再轉義。
完整的字符串型驗證器的列表參考附錄 A.4 。
參考附錄A.5-A.8
一條規則中能夠有多個驗證器先後串聯,它們之間是「AND」的關係,如:
"file" => "FileMaxSize:10m|FileImage"
複製代碼
這個驗證要求參數"file"是一個圖像文件,而且文件大小不超過10m
null
(這個是PHP的null
值,而不是字符串"null")(參數值爲null
等價於參數不存在)。例:
"size" => "Required|StrIn:small,middle,large"
複製代碼
該驗證要求參數"size"必須是字符串的"small", "middle"或者"large"。
好比當建立一個用戶時,要求姓名、性別、年齡所有都要提供;可是當更新用戶信息時,不須要提供所有信息,提供哪一個信息就更新哪一個信息。
$validations = [
"name" => "Required|StrLenGeLe:2,20",
"sex" => "Required|IntIn:0,1",
"age" => "Required|IntGeLe:1,200",
];
$userInfo = [
"name" => "tom",
"sex" => "0",
"age" => "10",
];
Validation::validate($userInfo, $validations); // 建立用戶時的驗證
unset($userInfo["age"]); // 刪除age字段
Validation::validate($userInfo, $validations, true); // 更新用戶信息時的驗證
複製代碼
注意上面代碼的最後一行:validate()
函數的第三個參數爲true表示忽略全部的 Required 驗證器。
這樣咱們就只須要寫一份驗證規則,就能夠同時用於建立用戶和更新用戶信息這兩個接口。
下面這個例子展現了包含數組和對象的嵌套的參數的驗證:
$params = [
"comments" => [
[
"title" => "title 1",
"content" => "content 1",
],
[
"title" => "title 1",
"content" => "content 1",
],
[
"title" => "title 1",
"content" => "content 1",
],
]
];
$validations = [
"comments[*].title" => "Required|StrLenGeLe:2,50",
"comments[*].content" => "Required|StrLenGeLe:2,500",
];
Validation::validate($params, $validations);
複製代碼
條件判斷型驗證器都以"If"開頭。
好比你想招聘一批模特,男的要求180以上,女的要求170以上,驗證能夠這樣寫:
$validations = [
"sex" => "StrIn:male,female",
"height" => [
"IfStrEq:sex,male|IntGe:180",
"IfStrEq:sex,female|IntGe:170",
],
];
複製代碼
參數"sex"的值不一樣,參數"height"的驗證規則也不同。
完整的條件判斷型驗證器的列表參考附錄 A.9 。
多條驗證規則能夠並聯,它們之間是「或」的關係,如
"type" => [
"StrIn:small,middle,large",
"IntIn:1,2,3",
]
複製代碼
上面這條驗證要求參數"type"既能夠是字符串"small", "middle"或"large",也能夠整型的1, 2或3
驗證規則並聯不是簡單的「或」的關係,具體驗證流程以下:
這些規則若是要徹底理清並非一件容易的事,因此不建議使用驗證規則並聯,也儘可能不要設計須要這種驗證方式的參數。
null
, ""
,0
,false
的問題這些特殊的值是不等價的,它們是不一樣的數據類型(須要用不一樣的驗證器去驗證):
""
是字符串。0
是整型。false
是bool型。null
是PHP的空。在本工具中它有特殊的含義。若是某個參數的值爲null
,則本工具會視爲該參數不存在。
好比下面兩個array對於本工具來講是等價的.
$params = [
"name" => "hello",
];
複製代碼
與
$params = [
"name" => "hello",
"comment" => null,
];
複製代碼
是等價的。
對於如下url地址
http://abc.com/index.php?p1=&&p2=hello&&p3=123
複製代碼
咱們將獲得的參數數組:
$params = [
"p1" => "",
"p2" => "hello",
"p3" => "123",
];
複製代碼
注意:
""
,而不是null
。"123"
,而不是整型123
。null
值的。本工具的全部驗證器都是強類型的,"Int*"驗證的是整型,"Float*"驗證的是浮點型,"Str*"驗證的是字符串型,數據類型不匹配,驗證是通不過的。可是字符串類型是個例外。
由於常規的HTTP請求,全部的基本數據類型最終都會轉換成字符串,因此:
123
和字符串"123"
都可以經過驗證器"Int"的驗證;123.0
和字符串"123.0"
都可以經過驗證器"Float"的驗證;true
和字符串"true"
都可以經過驗證器"Bool"的驗證;null
值和字符串"null"
永遠不等價,字符串"null"
就只是普通的字符串。若是參數驗證不經過,Validation::validate()
方法會拋出異常,這個異常會包含驗證不經過的錯誤信息描述的文本。
可是這個描述文本對用戶來講可能不那麼友好,咱們能夠經過兩個僞驗證器來自定義這些文本:
Alias
用於自定義參數名稱(這個名稱會與內部的錯誤信息模版相結合,生成最終的錯誤信息描述文本)>>>
用於自定義錯誤描述文本(這個文本會徹底取代模版生成的錯誤描述文本)。看下面的例子:
$params = [
"title" => "a",
];
Validation::validate($params, [
"title" => "Required|StrLenGeLe:2,50",
]); // 拋出異常的錯誤描述爲:「title」長度必須在 2 - 50 之間
Validation::validate($params, [
"title" => "Required|StrLenGeLe:2,50|Alias:標題", // 自定義參數名稱
]); // 拋出異常的錯誤描述爲:「標題」長度必須在 2 - 50 之間
Validation::validate($params, [
"title" => "Required|StrLenGeLe:2,50|>>>:標題長度應在2~50之間", // 自定義錯誤信息描述文本
]); // 拋出異常的錯誤描述爲:標題長度應在2~50之間
複製代碼
參考附錄A.10獲取更詳細的信息
從0.4版開始:
$langCode2ErrorTemplates
來進行「錯誤提示信息模版」的翻譯,主要目的是簡化格式(感謝 @gitHusband 的建議)。$langCodeToErrorTemplates
仍然有效,已有代碼無需修改(參考下一節)。若是新舊翻譯表同時提供,優先新的,新表中查不到再使用舊的。要支持國際化,須要自定義一個類,繼承\WebGeeker\Validation\Validation
,重載兩個靜態成員變量:
$langCode2ErrorTemplates
用於提供「錯誤提示信息模版」的翻譯對照表。完整的錯誤提示信息模版列表能夠在\WebGeeker\Validation\Validation::$errorTemplates
成員變量中找到$langCodeToTranslations
用於提供「自定義參數名稱」(由Alias
指定)和「自定義錯誤描述文本」(由>>>
指定)的翻譯對照表。下面提供一個示例類:
class MyValidation extends Validation {
// 「錯誤提示信息模版」翻譯對照表
protected static $langCodeToErrorTemplates = [
"zh-tw" => [
'Int' => '「{{param}}」必須是整數', // 🌝
'IntGt' => '「{{param}}」必須大於 {{min}}',
'Str' => '「{{param}}」必須是字符串',
],
"en-us" => [
'Int' => '{{param}} must be an integer',
'IntGt' => '{{param}} must be greater than {{min}}',
'Str' => '{{param}} must be a string',
],
];
// 文本翻譯對照表
protected static $langCodeToTranslations = [
"zh-tw" => [
"變量" => "變量", // 🌙
"變量必須是整數" => "變量必須是整數", // ⭐
],
"en-us" => [
"變量" => "variable",
"變量必須是整數" => "variable must be an integer",
],
];
}
複製代碼
注意:
使用這個MyValidation
類來進行驗證,就能夠實現文本的翻譯了。
MyValidation::setLangCode("zh-tw"); // 設置語言代碼
MyValidation::validate(["var" => 1.0], [
"var" => "Int", // 既沒有Alias,也沒有>>>,只會翻譯錯誤提示信息模版(對應🌝那行)
]); // 會拋出異常:「var」必須是整數
MyValidation::validate(["var" => 1.0], [
"var" => "Int|Alias:變量", // 有Alias,除了翻譯錯誤提示信息模版外,還會翻譯參數名稱(對應🌙那行)
]); // 會拋出異常:「變量」必須是整數
MyValidation::validate(["var" => 1.0], [
"var" => "Int|>>>:變量必須是整數", // 有>>>,會翻譯自定義錯誤描述文本(對應⭐那行)
]); // 會拋出異常:變量必須是整數
複製代碼
若是提供了錯誤的語言代碼,或者沒有找到翻譯的文本,那麼就不翻譯,輸出原始的文本。
(若是你使用的是0.4及以後的版本,建議使用新的國際化方案(參考上一節),更簡潔一點)。
要支持國際化,須要自定義一個類,繼承\WebGeeker\Validation\Validation
,重載兩個靜態成員變量:
$langCodeToErrorTemplates
用於提供「錯誤提示信息模版」的翻譯對照表。完整的錯誤提示信息模版列表能夠在\WebGeeker\Validation\Validation::$errorTemplates
成員變量中找到$langCodeToTranslations
用於提供「自定義參數名稱」(由Alias
指定)和「自定義錯誤描述文本」(由>>>
指定)的翻譯對照表。下面提供一個示例類:
class MyValidation extends Validation {
// 「錯誤提示信息模版」翻譯對照表
protected static $langCodeToErrorTemplates = [
"zh-tw" => [
"「{{param}}」必須是整數" => "「{{param}}」必須是整數", // 🌝
"「{{param}}」必須是字符串" => "「{{param}}」必須是字符串",
],
"en-us" => [
"「{{param}}」必須是整數" => "{{param}} must be a integer",
"「{{param}}」必須是字符串" => "{{param}} must be a string",
],
];
// 文本翻譯對照表
protected static $langCodeToTranslations = [
"zh-tw" => [
"變量" => "變量", // 🌙
"變量必須是整數" => "變量必須是整數", // ⭐
],
"en-us" => [
"變量" => "variable",
"變量必須是整數" => "variable must be an integer",
],
];
}
複製代碼
注意:
使用這個MyValidation
類來進行驗證,就能夠實現文本的翻譯了。
MyValidation::setLangCode("zh-tw"); // 設置語言代碼
MyValidation::validate(["var" => 1.0], [
"var" => "Int", // 既沒有Alias,也沒有>>>,只會翻譯錯誤提示信息模版(對應🌝那行)
]); // 會拋出異常:「var」必須是整數
MyValidation::validate(["var" => 1.0], [
"var" => "Int|Alias:變量", // 有Alias,除了翻譯錯誤提示信息模版外,還會翻譯參數名稱(對應🌙那行)
]); // 會拋出異常:「變量」必須是整數
MyValidation::validate(["var" => 1.0], [
"var" => "Int|>>>:變量必須是整數", // 有>>>,會翻譯自定義錯誤描述文本(對應⭐那行)
]); // 會拋出異常:變量必須是整數
複製代碼
若是提供了錯誤的語言代碼,或者沒有找到翻譯的文本,那麼就不翻譯,輸出原始的文本。
整型驗證器所有以"Int"開頭。
整型驗證器 | 示例 | 說明 |
---|---|---|
Int | Int | 「{{param}}」必須是整數 |
IntEq | IntEq:100 | 「{{param}}」必須等於 {{value}} |
IntGt | IntGt:100 | 「{{param}}」必須大於 {{min}} |
IntGe | IntGe:100 | 「{{param}}」必須大於等於 {{min}} |
IntLt | IntLt:100 | 「{{param}}」必須小於 {{max}} |
IntLe | IntLe:100 | 「{{param}}」必須小於等於 {{max}} |
IntGtLt | IntGtLt:1,100 | 「{{param}}」必須大於 {{min}} 小於 {{max}} |
IntGeLe | IntGeLe:1,100 | 「{{param}}」必須大於等於 {{min}} 小於等於 {{max}} |
IntGtLe | IntGtLe:1,100 | 「{{param}}」必須大於 {{min}} 小於等於 {{max}} |
IntGeLt | IntGeLt:1,100 | 「{{param}}」必須大於等於 {{min}} 小於 {{max}} |
IntIn | IntIn:2,3,5,7,11 | 「{{param}}」只能取這些值: {{valueList}} |
IntNotIn | IntNotIn:2,3,5,7,11 | 「{{param}}」不能取這些值: {{valueList}} |
內部一概使用double來處理
浮點型驗證器 | 示例 | 說明 |
---|---|---|
Float | Float | 「{{param}}」必須是浮點數 |
FloatGt | FloatGt:1.0 | 「{{param}}」必須大於 {{min}} |
FloatGe | FloatGe:1.0 | 「{{param}}」必須大於等於 {{min}} |
FloatLt | FloatLt:1.0 | 「{{param}}」必須小於 {{max}} |
FloatLe | FloatLe:1.0 | 「{{param}}」必須小於等於 {{max}} |
FloatGtLt | FloatGtLt:0,1.0 | 「{{param}}」必須大於 {{min}} 小於 {{max}} |
FloatGeLe | FloatGeLe:0,1.0 | 「{{param}}」必須大於等於 {{min}} 小於等於 {{max}} |
FloatGtLe | FloatGtLe:0,1.0 | 「{{param}}」必須大於 {{min}} 小於等於 {{max}} |
FloatGeLt | FloatGeLt:0,1.0 | 「{{param}}」必須大於等於 {{min}} 小於 {{max}} |
bool型驗證器 | 示例 | 說明 |
---|---|---|
Bool | Bool | 合法的取值爲: true , false , "true" , "false" (忽略大小寫) |
BoolSmart | BoolSmart | 合法的取值爲: true , false , "true" , "false" , 1 , 0 , "1" , "0" , "yes" , "no" , "y" , "n" (忽略大小寫) |
字符串型驗證器 | 示例 | 說明 |
---|---|---|
Str | Str | 「{{param}}」必須是字符串 |
StrEq | StrEq:abc | 「{{param}}」必須等於"{{value}}" |
StrEqI | StrEqI:abc | 「{{param}}」必須等於"{{value}}"(忽略大小寫) |
StrNe | StrNe:abc | 「{{param}}」不能等於"{{value}}" |
StrNeI | StrNeI:abc | 「{{param}}」不能等於"{{value}}"(忽略大小寫) |
StrIn | StrIn:abc,def,g | 「{{param}}」只能取這些值: {{valueList}} |
StrInI | StrInI:abc,def,g | 「{{param}}」只能取這些值: {{valueList}}(忽略大小寫) |
StrNotIn | StrNotIn:abc,def,g | 「{{param}}」不能取這些值: {{valueList}} |
StrNotInI | StrNotInI:abc,def,g | 「{{param}}」不能取這些值: {{valueList}}(忽略大小寫) |
StrLen | StrLen:8 | 「{{param}}」長度必須等於 {{length}} |
StrLenGe | StrLenGe:8 | 「{{param}}」長度必須大於等於 {{min}} |
StrLenLe | StrLenLe:8 | 「{{param}}」長度必須小於等於 {{max}} |
StrLenGeLe | StrLenGeLe:6,8 | 「{{param}}」長度必須在 {{min}} - {{max}} 之間 |
ByteLen | ByteLen:8 | 「{{param}}」長度(字節)必須等於 {{length}} |
ByteLenGe | ByteLenGe:8 | 「{{param}}」長度(字節)必須大於等於 {{min}} |
ByteLenLe | ByteLenLe:8 | 「{{param}}」長度(字節)必須小於等於 {{max}} |
ByteLenGeLe | ByteLenGeLe:6,8 | 「{{param}}」長度(字節)必須在 {{min}} - {{max}} 之間 |
Letters | Letters | 「{{param}}」只能包含字母 |
Alphabet | Alphabet | 同Letters |
Numbers | Numbers | 「{{param}}」只能是純數字 |
Digits | Digits | 同Numbers |
LettersNumbers | LettersNumbers | 「{{param}}」只能包含字母和數字 |
Numeric | Numeric | 「{{param}}」必須是數值。通常用於大數處理(超過double表示範圍的數,通常會用字符串來表示)(還沒有實現大數處理), 若是是正常範圍內的數, 可使用'Int'或'Float'來檢測 |
VarName | VarName | 「{{param}}」只能包含字母、數字和下劃線,而且以字母或下劃線開頭 |
「{{param}}」必須是合法的email | ||
Url | Url | 「{{param}}」必須是合法的Url地址 |
Ip | Ip | 「{{param}}」必須是合法的IP地址 |
Mac | Mac | 「{{param}}」必須是合法的MAC地址 |
Regexp | Regexp:/^abc$/ | Perl正則表達式匹配 |
數組型驗證器 | 示例 | 說明 |
---|---|---|
Arr | Arr | 「{{param}}」必須是數組 |
ArrLen | ArrLen:5 | 「{{param}}」數組長度必須等於 {{length}} |
ArrLenGe | ArrLenGe:1 | 「{{param}}」數組長度必須大於等於 {{min}} |
ArrLenLe | ArrLenLe:9 | 「{{param}}」數組長度必須小於等於 {{max}} |
ArrLenGeLe | ArrLenGeLe:1,9 | 「{{param}}」長數組度必須在 {{min}} ~ {{max}} 之間 |
對象型驗證器 | 示例 | 說明 |
---|---|---|
Obj | Obj | 「{{param}}」必須是對象 |
文件型驗證器 | 示例 | 說明 |
---|---|---|
File | File | 「{{param}}」必須是文件 |
FileMaxSize | FileMaxSize:10mb | 「{{param}}」必須是文件, 且文件大小不超過{{size}} |
FileMinSize | FileMinSize:100kb | 「{{param}}」必須是文件, 且文件大小不小於{{size}} |
FileImage | FileImage | 「{{param}}」必須是圖片 |
FileVideo | FileVideo | 「{{param}}」必須是視頻文件 |
FileAudio | FileAudio | 「{{param}}」必須是音頻文件 |
FileMimes | FileMimes:mpeg,jpeg,png | 「{{param}}」必須是這些MIME類型的文件:{{mimes}} |
日期和時間型驗證器 | 示例 | 說明 |
---|---|---|
Date | Date | 「{{param}}」必須符合日期格式YYYY-MM-DD |
DateFrom | DateFrom:2017-04-13 | 「{{param}}」不得早於 {{from}} |
DateTo | DateTo:2017-04-13 | 「{{param}}」不得晚於 {{to}} |
DateFromTo | DateFromTo:2017-04-13,2017-04-13 | 「{{param}}」必須在 {{from}} ~ {{to}} 之間 |
DateTime | DateTime | 「{{param}}」必須符合日期時間格式YYYY-MM-DD HH:mm:ss |
DateTimeFrom | DateTimeFrom:2017-04-13 12:00:00 | 「{{param}}」不得早於 {{from}} |
DateTimeTo | DateTimeTo:2017-04-13 12:00:00 | 「{{param}}」必須早於 {{to}} |
DateTimeFromTo | DateTimeFromTo:2017-04-13 12:00:00,2017-04-13 12:00:00 | 「{{param}}」必須在 {{from}} ~ {{to}} 之間 |
在一條驗證規則中,條件驗證器必須在其它驗證器前面,多個條件驗證器能夠串聯。
注意,條件判斷中的「條件」通常是檢測另一個參數的值,而當前參數的值是由串聯在條件判斷驗證器後面的其它驗證器來驗證。
條件判斷型驗證器 | 示例 | 說明 |
---|---|---|
If | If:selected | 若是參數"selected"值等於 1, true, '1', 'true', 'yes'或 'y'(字符串忽略大小寫) |
IfNot | IfNot:selected | 若是參數"selected"值等於 0, false, '0', 'false', 'no'或'n'(字符串忽略大小寫) |
IfTrue | IfTrue:selected | 若是參數"selected"值等於 true 或 'true'(忽略大小寫) |
IfFalse | IfFalse:selected | 若是參數"selected"值等於 false 或 'false'(忽略大小寫) |
IfExist | IfExist:var | 若是參數"var"存在 |
IfNotExist | IfNotExist:var | 若是參數"var"不存在 |
IfIntEq | IfIntEq:var,1 | if (var === 1) |
IfIntNe | IfIntNe:var,2 | if (var !== 2). 特別要注意的是若是條件參數var的數據類型不匹配, 那麼If條件是成立的; 而其它幾個IfIntXx當條件參數var的數據類型不匹配時, If條件不成立 |
IfIntGt | IfIntGt:var,0 | if (var > 0) |
IfIntLt | IfIntLt:var,1 | if (var < 0) |
IfIntGe | IfIntGe:var,6 | if (var >= 6) |
IfIntLe | IfIntLe:var,8 | if (var <= 8) |
IfIntIn | IfIntIn:var,2,3,5,7 | if (in_array(var, [2,3,5,7])) |
IfIntNotIn | IfIntNotIn:var,2,3,5,7 | if (!in_array(var, [2,3,5,7])) |
IfStrEq | IfStrEq:var,waiting | if (var === 'waiting') |
IfStrNe | IfStrNe:var,editing | if (var !== 'editing'). 特別要注意的是若是條件參數var的數據類型不匹配, 那麼If條件是成立的; 而其它幾個IfStrXx當條件參數var的數據類型不匹配時, If條件不成立 |
IfStrGt | IfStrGt:var,a | if (var > 'a') |
IfStrLt | IfStrLt:var,z | if (var < 'z') |
IfStrGe | IfStrGe:var,A | if (var >= '0') |
IfStrLe | IfStrLe:var,Z | if (var <= '9') |
IfStrIn | IfStrIn:var,normal,warning,error | if (in_array(var, ['normal', 'warning', 'error'], true)) |
IfStrNotIn | IfStrNotIn:var,warning,error | if (!in_array(var, ['warning', 'error'], true)) |
其它驗證器 | 示例 | 說明 |
---|---|---|
Required | Required | 待驗證的參數是必需的。若是驗證器串聯,除了條件型驗證器外,必須爲第一個驗證器 |
Alias | Alias:參數名稱 | 自定義錯誤提示文本中的參數名稱(必須是最後一個驗證器) |
>>> | >>>:這是自定義錯誤提示文本 | 自定義錯誤提示文本(與Alias驗證器二選一,必須是最後一個驗證器) |
自定義PHP函數 | function() {} | 暫不提供該機制,由於若是遇到本工具不支持的複雜參數驗證,你能夠直接寫PHP代碼來驗證,不須要再經由本工具來驗證(不然就是脫褲子放屁,畫蛇添足) |