它是一個 PHP 庫,用於根據條件獲取和驗證欄位並將訊息儲存在不同的容器中(包括錯誤、警告、資訊和成功)。
這個函式庫背後的想法很簡單:3 個類,一個簡單的依賴項,並且在 PHP 7.1 及更高版本中運行,因此它幾乎可以在任何 PHP 專案中運行,包括 WordPress、Laravel、核心 PHP 專案等。

範例
PHP 教學表格和表格

這是一個功能性的例子。典型的範例更加複雜,即使只有幾行程式碼。
假設我們想要驗證一個名為「id」的輸入值(取得),我們可以執行以下操作:
use eftec ValidationOne ;
$ val = new ValidationOne ();
$ r = $ val -> def ( ' ERROR ' )
-> type ( ' integer ' )
-> ifMissingThenDefault ()
-> condition ( " eq " , " It's not equals to 10 " , 10 )
-> condition ( " eq " , " It's not equals to 30 (info) " , 30 , ' info ' )
-> ifFailThenDefault ()
-> get ( ' id ' ); // <-- end of the chain但錯誤在哪裡呢?訊息儲存在messageList中
var_dump ( $ val -> messageList -> allArray ()); // here we show all messages of any kind of type.
var_dump ( $ val -> messageList -> errorCount ); // returns the number of errors.
var_dump ( $ val -> errorcount ()); // returns the number of errors (alternative)
var_dump ( $ val -> hasError ()); // returns true if there is an error.但是,我們也可以按類型(錯誤、警告...)顯示訊息,並且僅按特定標識符顯示訊息。
var_dump ( $ val -> messageList -> get ( ' id ' )-> allErrorOrWarning ()); // All error or warning contained in the key "id".為什麼訊息儲存在某種結構中?簡單的回傳錯誤不是很簡單嗎?
答案是一種形式。假設我們有一個包含三個欄位的表單。如果其中一個失敗,則每個欄位的錯誤必須分別可見。此外,整個表格可以有自己的資訊。
鏈的開始通常寫在程式碼的最後。
允許的方法有:
例子:
$ val = new ValidationOne ();
$ id = $ val -> type ( ' integer ' )-> get ( ' id ' );
$ id = $ val -> type ( ' integer ' )-> post ( ' id ' );
$ id = $ val -> type ( ' integer ' )-> request ( ' id ' );
$ id = $ val -> type ( ' integer ' )-> set ( ' 123 ' , ' id ' );
$ val = new ValidationOne ();
$ id = $ val -> type ( ' integer ' )-> get ( ' id ' ); // $_GET['id']
$ val = new ValidationOne ( ' frm ' ); // we set a prefix for every reading.
$ id = $ val -> type ( ' integer ' )-> get ( ' id ' ); // $_GET['frm_id'] 條件 ($condition, $message = "", $conditionValue = null, $level = 'error', $key = null)
它添加了一個條件,即它取決於輸入的類型。
@參數字串$條件
數字:req、eq、ne、gt、lt、gte、lte、之間、null、notnull
字串:req,eq,ne,minlen,maxlen, Betweenlen,null,notnull,contain,notcontain ,alpha,alphanum,text,regexp,email,url,domain
日期:req、eq、ne、gt、lt、gte、lte、之間
日期字串:req、eq、ne、gt、lt、gte、lte、之間
布林值:req、eq、ne、true、false
文件:最小尺寸,最大尺寸,要求,圖像,文檔,壓縮,架構,擴展
功能:
fn.static.Class.methodstatic
fn.全域函數
fn.object.Class.method 其中 object 是全域 $object
fn.class.Class.method
fn.class.命名空間Class.method
@參數字串$訊息
訊息可以使用下一個變數 '%field'、'%realfield'、'%value'、'%comp'、'%first'、'%second'
| 場地 | 描述 | 例子 |
|---|---|---|
| %場地 | 欄位名稱,可以是朋友ID或實際名稱 | 客戶ID |
| %實場 | 欄位名稱(不是friendid ) | 客戶識別碼 |
| %價值 | 欄位的當前值 | 約翰 |
| %補償 | 要比較的值(如果有) | |
| %第一的 | 要比較的第一個值(如果比較值是陣列) | |
| %第二 | 要比較的第二個值(如果比較值是陣列) | |
| %鑰匙 | 使用的鍵(用於輸入數組) |
@param null $conditionValue
@param string $level(錯誤,警告,訊息,成功)。錯誤的等級。有關詳細信息,請參閱MessageContainer
@param string $key 如果key不為null則用於透過key新增多個條件
@return ValidationOne
注意:如果值為 null 且 isNullValid() 為 true,則忽略條件。如果值缺失且 isMissingValid() 為 true,則忽略條件。如果值為空 ('') 且 isEmptyValid() 為 true,則忽略條件。如果值為空 ('') 或 null 且 isNullOrEmptyValid() 為 true,則忽略條件。當我們只想驗證某個值是否存在或該值已設定時,isNullValid()、isMissingValid()、isNullOrEmptyValid() 和 isEmptyValid() 非常有用。
例子:
$ validation -> def ( null )
-> type ( ' integer ' )
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' , 50 )
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' , 60 )
-> set ( ' aaa ' , ' variable2 ' ); | 類型 | 描述 |
|---|---|
| 整數 | (數字)它允許沒有小數的數字 |
| UNIX時間 | (數字)它允許沒有小數的數字 |
| 布林值 | (布林值)它儲存 true 或 false。輸入可能會有所不同(空、零或 null = false,否則為 true) |
| 小數 | (數字)它允許帶小數的數字 |
| 漂浮 | (數字)它允許帶小數的數字 |
| varchar | (字串)它允許任何輸入 |
| 細繩 | (字串)它允許任何輸入 |
| 日期 | (日期)輸入可以是日期時間或字串。該值儲存為 DateTime 對象 |
| 日期時間 | (日期)輸入可以是日期時間或字串。該值儲存為 DateTime 對象 |
| 日期字串 | (日期)輸入可以是日期時間或字串。該值儲存為字串 |
| 日期時間字串 | (日期)輸入可以是日期時間或字串。該值儲存為字串 |
| 文件 | (檔案)輸入是一個字串,並且它儲存為字串,但它添加了特殊的驗證 |
| 輸入類型 | 狀態 | |
|---|---|---|
| 數位 | gt,lt,gte,lte,之間 | |
| 細繩 | minlen、maxlen、 Betweenlen、包含 ,notcontain,alpha,alphanum,文字,正規表達式,電子郵件,url,域 | |
| 日期 | gt,lt,gte,lte,之間 | |
| 日期字串 | gt,lt,gte,lte,之間 | |
| 布林值 | 真,假 | |
| 文件 | 最小尺寸、最大尺寸、需求、影像、文件、壓縮、體系結構、擴展 | |
| *(適用於任何類型) | 請求,eq,ne,null,notnull,空,notempty | |
| * | 功能 | |
| * | fn.static.Class.methodstatic | |
| * | fn.全域函數 | |
| * | fn.object.Class.method 其中 object 是全域 $object | |
| * | fn.class.Class.method | |
| * | fn.class.命名空間Class.method |
| 狀態 | 描述 | 值範例 |
|---|---|---|
| 建築學 | 檔案的副檔名必須是架構檔(dwg等) | |
| 之間 | 該數字必須介於兩個值之間 | [0,20] |
| 之間的長度 | 文字長度必須介於兩個值之間 | [0,20] |
| 壓縮 | 檔案的副檔名必須是壓縮文件 | |
| 包含 | 文字必須包含一個值 | "文字" |
| 文件 | 文件的副檔名必須是文件文件 | |
| eq(可以是數組或值)/ == | 該值必須等於 該值必須包含在數組中 | “文本”,[“文本”,“文本2”] |
| 存在 | 文件或值必須存在(可以為 null/空) | |
| 缺失/不存在 | 文件或值不得存在或為 null/空 | |
| 必需(或要求) | 該值不能為 null 或為空 | |
| 分機 | 擴展名(檔案)必須在擴展名列表中 | [“ext1”,“ext2”,“ext3”] |
| 錯誤的 | 該值必須為 false (===false) | |
| fn.class.命名空間Class.method | 類別的方法必須傳回 true | |
| fn.class.Class.method | 類別的方法必須傳回 true | |
| fn.全域函數 | 全域函數必須傳回 true | |
| fn.object.Class.method 其中 object 是全域 $object | 全域物件的方法必須回傳true | |
| fn.static.Class.methodstatic | 類別的靜態方法必須回傳 true | |
| 功能 | 該函數必須傳回 true | |
| >> | 該值必須大於 | 123 |
| gte / >= | 該值必須大於或等於 | 123 |
| 影像 | 文件的擴展名必須是圖像文件 | |
| 長/< | 該值必須小於 | 123 |
| LTE / <= | 該值必須小於或等於 | 123 |
| 最大長度 | 字串的最大長度 | 123 |
| 最大尺寸 | 文件的最大大小 | 123 |
| 敏倫 | 字串的最小長度 | 123 |
| 最小尺寸 | 文件的最小大小 | 123 |
| mime(要比較的值可以是字串或陣列) | 文件的 mime 類型 | “應用程式/msword”或[“應用程式/msword”,“圖片/gif”] |
| 模仿型 | 文件的 mime 類型(無子類型) | “應用程式”或[“應用程序,”圖像”] |
| ne / != (要比較的值可以是單一值或陣列) | 該值不得相等。 或該值不能包含在數組中 | 123,[123,345],["aa","bb"] |
| 不包含 | 該值不得包含值 | "文字" |
| 不為空 | 該值不能為空 | |
| 無效的 | 該值必須為空 | |
| 空的 | 該值必須為空(即“”,0,null) | |
| 不空的 | 該值不能為空(即不等於“”、0、null) | |
| 要求 | 該值必須存在 | |
| 真的 | 該值必須為 true (===true) |
範例:
$ validation -> def ( null )
-> type ( ' integer ' )
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' , 50 )
-> condition ( ' between ' , ' %field %value must be between 1 and 50 ' ,[ 1 , 50 ])
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' , 60 )
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' ,[ 60 , 200 ]) // eq allows a single or array
-> condition ( ' fn.static.Example.customval ' , ' the function does not work ' )
-> condition ( ' req ' )
-> condition ( ' lt ' , " es muy grande " , 2000 , ' warning ' )
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' , 50 )
-> condition ( ' fn.static.Example.fnstatic ' , ' the static function does not work ' )
-> condition ( ' fn.static.somespaceSomeclass.methodStatic ' , null )
-> condition ( ' fn.global.customval ' , ' The global function does not work ' )
-> condition ( ' fn.object.example.fnnostatic ' , ' the function object does not work ' )
-> condition ( ' fn.class.somespaceSomeclass.method ' , ' The function some class does not work ' )
-> condition ( ' fn.class.Example.fnnostatic ' , ' la funcion class no funciona ' );
// ->condition('fn.static.Example.customval','la funcion no funciona')
function customval ( $ value , $ compareValue ) {
return true ;
}有時我們需要使用自訂條件。我們可以建立一個全域變數、一個靜態函數,甚至是一個類別內的方法。
建立的每個方法或函數都必須有兩個參數(任何名稱):
例如,如果我們需要評估某個 id 是否在資料庫中不存在怎麼辦?
$ validation -> condition ( ' fn.global.idExist ' , ' The id already exist! ' )-> get ( " id " );
function idExist ( $ id , $ compare = null ) {
// select count(*) c from table where id=$id
if ( $ c > 0 ) {
return true ;
} else {
return false ;
}
}注意:如果我們需要指定命名空間,那麼我們可以使用符號:namespaceSomeClass
$ validation -> condition ( ' fn.global.customfn ' ); // global
$ validation -> condition ( ' fn.static.SomeClass.staticfn ' ); // calling a static method inside the class SomeClass.
$ validation -> condition ( ' fn.class.SomeClass.noStaticFn ' ); // method inside a class,it creates an instance of an object then it calls the method
$ validation -> condition ( ' fn.object.myObject.noStaticFn ' ); // method inside a class, it uses an instance called $myObject
// global function
function customfn ( $ value , $ compareValue ) {
// returns true or false
}
// static function
$ myObject = new SomeClass ();
class SomeClass {
public static function staticfn ( $ value , $ compareValue ) {
// returns true or false
}
public function noStaticFn ( $ value , $ compareValue ) {
// returns true or false
}
}當我們驗證一個物件時,它可以將資訊儲存在訊息容器(也稱為訊息列表)內。
MessageContainer (EFTEC/MessageContainer) 以層次結構方式包含一個清單訊息:
Container (usually only 1 for all the project)
Lockers (from zero to many)
Messages (from zero to many and grouped by level)
$ container -> get ( ' locker20 ' )-> firstError (); // it returns the first message of error in the locker20 that is part of the container.
訊息分級如下
| ID | 描述 | 例子 |
|---|---|---|
| 錯誤 | 該訊息是一個錯誤,必須解決。這是我們的表演終結者。 | 資料庫已關閉 |
| 警告 | 該訊息是一個警告,也許可以忽略它。但是, MessageContainer類別允許將錯誤和警告分組為相同的群組。 | 註冊表已儲存但有警告 |
| 資訊 | 訊息就是訊息。例如,記錄或調試操作。 | 日誌已儲存 |
| 成功 | 提示操作成功 | 訂單已接受 |
| 功能 | 描述 | 例子 |
|---|---|---|
| addMessage($idLocker, $message, $level = '錯誤') | 它在儲物櫃內添加一條訊息。 通常,它是由庫自動完成的,但您可以透過程式碼手動添加訊息。 | $this->addMessage('pwd','需要密碼','錯誤'); |
| getMessage($withWarning = false) | 它會取得第一個錯誤訊息,如果沒有則為空 | $this->getMessage(); |
| getMessages($withWarning = false) | 它會取得所有錯誤訊息,如果沒有則為空 | $this->getMessages(); |
| 取得訊息Id($idLocker) | 它會取得MessageLocker物件(有關更多信息,請參閱 EFTEC/MessageContainer) | $obj=$this->getMessageId('pwd'); |
| 錯誤計數(包括警告=假) | 它獲取錯誤計數 | $count=$this->errorCount(); |
| 有錯誤($includeWarning = false) | 如果有錯誤則傳回 true | $fail=$this->hasError(); |
| 場地 | 描述 | 例子 |
|---|---|---|
| $messageList | 它獲取所有容器。它傳回MessageContainer類型的對象 | $container=$this->messageList; |
您可以在 EFTEC/MessageContainer 中查看有關MessageContainer的更多信息
例子:
$ validation -> addMessage ( ' idlocker ' , ' this field is required ' , ' error ' ); // it adds a message inside a locker.
$ validation -> messageList -> get ( ' idlocker ' )-> allError (); // it gets all errors from the locker idlocker
$ validation -> getMessages ( true ); // it gets all messages of error or warning from all the lockers. 我們還可以處理日期。日期格式有多種類型。
| 類型 | 描述 |
|---|---|
| 日期 | (日期)輸入可以是日期時間或字串。該值儲存為 DateTime 對象 |
| 日期時間 | (日期)輸入可以是日期時間或字串。該值儲存為 DateTime 對象 |
| 日期字串 | (日期)輸入可以是日期時間或字串。使用字段$dateOutputString將值儲存為字串 |
| 日期時間字串 | (日期)輸入可以是日期時間或字串。使用字段$dateLongOutputString將值儲存為字串 |
有兩種方式指定日期格式:短(僅日期)和長(日期和時間)。我們可以指定輸入和輸出的格式。
| 名稱欄位 | 描述 | 預設值 |
|---|---|---|
| $dateShort | 這是日期(短)的(預期)輸入格式 | 日/米/年 |
| $dateLong | 這是(預期的)輸入格式(帶有日期和時間) | 日/月/年:i:s |
| $dateOutputString | 它是輸出格式(對於日期字串) | 月日 |
| $dateLongOutputString | 它是輸出格式(對於日期時間字串) | YmdTH:i:sZ |
$ r = getVal ()-> type ( ' datestring ' )-> set ( ' 31-12-2019 ' ); // 2019-12-31 note: the default input value is d/m/Y, not m/d/Y我們可以透過更改欄位或呼叫下一個函數來更改日期格式
設定日期格式(輸入短、輸入長、輸出短、輸出長)
$ validation -> setDateFormat ( ' m/d/Y ' , ' m/d/Y H:i:s ' , ' Y-m-d ' , ' Y-m-dTH:i:sZ ' )我們將日期的格式設定為預設配置
$ validation -> setDateFormatDefault ();我們將日期格式設定為:
| 姓名 | 格式 |
|---|---|
| 輸入短路 | 米/天/年 |
| 輸入長 | 月/日/年:i:s |
| 輸出短路 | 月日 |
| 輸出長 | YmdTH:i:sZ |
$ validation -> setDateFormatEnglish ()預設情況下,該庫不會產生異常。但是,如果訊息的類型為“錯誤”和/或“警告”,則可能會產生異常。
使用這種方法,如果容器產生錯誤,那麼它儲存的也會產生新的異常。
注意:預設情況下,大多數訊息都是 ERROR 類型。
注意:當拋出該運算子時,不會分配值並且堆疊將被刪除,即如果我們拋出異常,所有資訊都會遺失。
try {
$ validation -> type ( ' integer ' )
-> throwOnError () // for errors only
-> set ( ' hello ' , ' field1 ' );
// or you could use:
$ validation -> type ( ' integer ' )
-> throwOnError ( true , true ) // for errors and warnings
-> set ( ' hello ' , ' field1 ' );
$ this -> fail ( ' this value means the throw failed ' );
} catch ( Exception $ ex ) {
$ this -> assertEquals ( ' field1 is not numeric ' , $ ex -> getMessage ());
}該庫中有四種不同的方法來處理空值。
$ validation -> exist ()-> set ( null ); // is valid.
$ validation -> exist ()-> set ( '' ); // is valid.
$ validation -> exist ()-> get ( ' field ' ); // is valid only if $_GET['field'] exist (even if it is null) $ validation -> required ()-> set ( null ); // is not valid.
$ validation -> required ()-> set ( "" ); // is not valid.
$ validation -> required ()-> set ( ' hi ' ); // is valid. $ validation -> notnull ()-> set ( null ); // is not valid.
$ validation -> notnull ()-> set ( "" ); // is valid.
$ validation -> notnull ()-> set ( ' hi ' ); // is valid. $ validation -> notempty ()-> set ( null ); // is valid.
$ validation -> notempty ()-> set ( "" ); // is not valid.
$ validation -> notempty ()-> set ( ' hi ' ); // is valid. 此外,還有 4 種方法可以接受缺失值(null 或empty),繞過任何條件。
$ validation -> isNullValid ()-> condition (... . )-> set ( null ); // is valid no matter the condition.
$ validation -> isNullorEmptyValid ()-> condition (... . )-> set ( null ); // is valid no matter the condition.
$ validation -> isEmptyValid ()-> condition (... . )-> set ( '' ); // is valid no matter the condition.
$ validation -> isMissingValid ()-> condition (... . )-> get ( ' field ' ); // If the field is missing, then is valid no matter the condition當我們需要驗證輸入是否具有某個值(除非該值缺失、為空或為 null)時,可以使用它。
isNullorEmptyValid() 等於呼叫: isEmptyValid()->isNullValid()
此外,這些運算符可以堆疊。
$ validation
-> isNullorEmptyValid ()
-> isMissingValid ()
-> condition (... . )
-> set (... . ); // this expression is valid if the value is null, empty(''), the value is missing, no matter the conditions. 我們可以設定一個預設值。當出現錯誤時,該值可以作為後備值。預設值永遠不會被轉換或處理。
$ validation
-> def (- 1 )
-> type ( ' integer ' )
-> ifFailThenDefault ()
-> set (...); // if the operation fails, then it returns -1修剪結果。預設情況下,結果不會被修剪。您可以修剪左側、右側或兩側。它使用方法convert()來執行操作。
$ validation -> trim ()-> set (... . ); // trim both sided
$ validation -> trim ( ' trim ' , ' ., ' )-> set (... . ); // trim . and ,
$ validation -> trim ( ' ltrim ' )-> set (... . ); // trim left sided
$ validation -> trim ( ' rtrim ' )-> set (... . ); // trim right sided有時,我們總是想修剪結果。所以我們可以使用這個方法來始終修剪結果。它在轉換結束時堆疊。