これは、フィールドのフェッチと検証を行い、条件に応じてメッセージをさまざまなコンテナー (エラー、警告、情報、成功を含む) に保存するための PHP ライブラリです。
このライブラリの背後にある思想は単純です: 3 つのクラス、単純な依存関係、PHP 7.1 以降で実行されるため、WordPress、Laravel、コア PHP プロジェクトなどを含む実質的にすべての 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".
メッセージが何らかの構造に保存されるのはなぜですか?単純にエラーを返すのは簡単ではないでしょうか?
答えは形です。 3 つのフィールドがあるフォームがあるとします。そのうちの 1 つが失敗した場合、エラーはフィールドごとに個別に表示される必要があります。また、フォーム全体に独自のメッセージを含めることもできます。
チェーンの開始部分は通常、コードの最後に記述されます。
許可されるメソッドは次のとおりです。
例:
$ 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)
入力のタイプに依存するという条件が追加されます。
@パラメータ文字列 $condition
番号: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,between
ブール値:req、eq、ne、true、false
ファイル:minsize,maxsize,req,image,doc,compression,architecture,ext
関数:
fn.static.Class.methodstatic
fn.global.function
fn.object.Class.method (object はグローバル $object)
fn.class.Class.メソッド
fn.class.namespaceClass.method
@param string $message
メッセージでは次の変数 '%field'、'%realfield'、'%value'、'%comp'、'%first'、'%second' を使用できます。
分野 | 説明 | 例 |
---|---|---|
%分野 | フィールドの名前。フレンド IDまたは実際の名前の可能性があります | 顧客ID |
%realfield | フィールドの名前 ( friendsidではありません) | 顧客識別子 |
%価値 | フィールドの現在の値 | ジョン |
%comp | 比較する値 (存在する場合) | |
%初め | 比較する最初の値 (比較値が配列の場合) | |
%2番 | 比較する 2 番目の値 (比較値が配列の場合) | |
%鍵 | 使用されるキー (入力配列用) |
@param null $conditionValue
@param string $level (エラー、警告、情報、成功)。エラーのレベル。詳細については、 「MessageContainer」を参照してください。
@param string $key キーが null でない場合、キーによって複数の条件を追加するために使用されます
@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 ' );
タイプ | 説明 |
---|---|
整数 | (数値) 小数点のない数値を許可します |
ユニクスタイム | (数値) 小数点のない数値を許可します |
ブール値 | (ブール値) true または false を格納します。入力は変化する可能性があります (空、ゼロ、または null = false、それ以外の場合は true) |
10進数 | (数値) 小数を含む数値を許可します |
フロート | (数値) 小数を含む数値を許可します |
可変長文字 | (文字列) 任意の入力を許可します |
弦 | (文字列) 任意の入力を許可します |
日付 | (日付) 入力は DateTime または文字列です。値はオブジェクト DateTime として保存されます |
日時 | (日付) 入力は DateTime または文字列です。値はオブジェクト DateTime として保存されます |
日付文字列 | (日付) 入力は DateTime または文字列です。値は文字列として保存されます |
日時文字列 | (日付) 入力は DateTime または文字列です。値は文字列として保存されます |
ファイル | (ファイル) 入力は文字列であり、文字列として保存されますが、特別な検証が追加されます |
入力タイプ | 状態 | |
---|---|---|
番号 | gt、lt、gte、lte、間 | |
弦 | ミンレン、マックスレン、間レン、含む ,notcontain,alpha,alphanum,text,regexp,email,url,domain | |
日付 | gt、lt、gte、lte、間 | |
日付文字列 | gt、lt、gte、lte、間 | |
ブール値 | 真、偽 | |
ファイル | minsize,maxsize,req,image,doc,compression,architecture,ext | |
* (どのタイプにも当てはまります) | req、eq、ne、null、notnull、空、notempty | |
* | 関数 | |
* | fn.static.Class.methodstatic | |
* | fn.global.function | |
* | fn.object.Class.method (object はグローバル $object) | |
* | fn.class.Class.メソッド | |
* | fn.class.namespaceClass.method |
状態 | 説明 | 値の例 |
---|---|---|
建築 | ファイルの拡張子は建築ファイル (dwg など) である必要があります。 | |
間 | 数値は 2 つの値の間にある必要があります | [0,20] |
間 | テキストの長さは 2 つの値の間である必要があります | [0,20] |
圧縮 | ファイルの拡張子は圧縮ファイルである必要があります | |
含む | テキストには値が含まれている必要があります | "文章" |
博士 | ファイルの拡張子はドキュメントファイルである必要があります | |
eq (配列または値の可能性があります) / == | 値は以下と等しい必要があります 値は配列に含まれている必要があります | "テキスト",["テキスト","テキスト2"] |
存在する | ファイルまたは値は存在する必要があります (null/空の可能性があります) | |
行方不明/存在しない | ファイルまたは値は存在しないか、null/空であってはなりません | |
必須 (または必須) | 値は null または空であってはなりません | |
内線 | 拡張子 (ファイル) は拡張子のリストに含まれている必要があります | ["ext1"、"ext2"、"ext3"] |
間違い | 値は false (===false) である必要があります。 | |
fn.class.namespaceClass.method | クラスのメソッドは true を返す必要があります | |
fn.class.Class.メソッド | クラスのメソッドは true を返す必要があります | |
fn.global.function | グローバル関数は true を返す必要があります | |
fn.object.Class.method (object はグローバル $object) | グローバル オブジェクトのメソッドは true を返す必要があります | |
fn.static.Class.methodstatic | クラスの静的メソッドは true を返す必要があります | |
関数 | 関数は true を返す必要があります | |
gt / > | 値は次より大きくなければなりません | 123 |
gte / >= | 値は以下でなければなりません | 123 |
画像 | ファイルの拡張子は画像ファイルである必要があります | |
lt / < | 値は以下である必要があります | 123 |
LTE / <= | 値は以下でなければなりません | 123 |
マックスレン | 文字列の最大長 | 123 |
最大サイズ | ファイルの最大サイズ | 123 |
ミンレン | 文字列の最小の長さ | 123 |
最小サイズ | ファイルの最小サイズ | 123 |
mime (比較する値は文字列または配列にすることができます) | ファイルの MIME タイプ | "application/msword" または ["application/msword","image/gif"] |
MIMEタイプ | ファイルの MIME タイプ (サブタイプなし) | "アプリケーション" または ["アプリケーション,"イメージ"] |
ne / != (比較する値は単一の値または配列にすることができます) | 値は等しくなくてはなりません。 または、値を配列に含めることはできません | 123,[123,345],["aa","bb"] |
含まれていない | 値には値を含めることはできません | "文章" |
nullではない | 値はnullであってはなりません | |
ヌル | 値はnullである必要があります | |
空の | 値は空でなければなりません (つまり、"",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 ;
}
場合によっては、カスタム条件を使用する必要があります。グローバル変数、静的関数、さらにはクラス内にメソッドを作成することもできます。
作成されるすべてのメソッドまたは関数には 2 つのパラメーター (任意の名前) が必要です。
たとえば、データベースに存在しない 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 = 'error') | ロッカー内にメッセージを追加します。 通常、これはライブラリによって自動的に行われますが、コードを介して手動でメッセージを追加することもできます。 | $this->addMessage('pwd','パスワードが必要です','error'); |
getMessage($withWarning = false) | 最初のエラー メッセージが表示されるか、何もない場合は空になります | $this->getMessage(); |
getMessages($withWarning = false) | すべてのエラー メッセージを取得するか、何もない場合は空を取得します | $this->getMessages(); |
getMessageId($idLocker) | MessageLockerオブジェクトを取得します (詳細については、EFTEC/MessageContainer を参照してください)。 | $obj=$this->getMessageId('pwd'); |
errorCount(includeWarning=false) | エラー数を取得します | $count=$this->errorCount(); |
hasError($includeWarning=false) | エラーがある場合は true を返します | $fail=$this->hasError(); |
分野 | 説明 | 例 |
---|---|---|
$messageList | コンテナをすべて取得します。 MessageContainer型のオブジェクトを返します。 | $container=$this->messageList; |
MessageContainerの詳細については、EFTEC/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 として保存されます。 |
日時 | (日付) 入力は DateTime または文字列です。値はオブジェクト DateTime として保存されます。 |
日付文字列 | (日付) 入力は DateTime または文字列です。値はフィールド$dateOutputStringを使用して文字列として保存されます。 |
日時文字列 | (日付) 入力は DateTime または文字列です。値はフィールド$dateLongOutputStringを使用して文字列として保存されます。 |
日付の形式を指定するには、短い形式 (日付のみ) と長い形式 (日付と時刻) の 2 つの方法があります。また、入力および出力として形式を指定することもできます。
名前フィールド | 説明 | デフォルト値 |
---|---|---|
$dateShort | これは、日付 (短い) の (予想される) 入力形式です。 | d/m/Y |
$dateLong | これは(期待される)入力形式(日付と時刻付き)です | d/m/YH:i:s |
$dateOutputString | (日付文字列の) 出力形式です。 | YMD |
$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 ();
日付の形式を次のように設定します。
名前 | 形式 |
---|---|
入力ショート | m/d/Y |
長い入力 | m/d/YH:i:s |
出力ショート | YMD |
長い出力 | YmdTH:i:sZ |
$ validation -> setDateFormatEnglish ()
デフォルトでは、このライブラリは例外を生成しません。ただし、メッセージのタイプが ERROR または WARNING である場合は、例外が生成される可能性があります。
このメソッドでは、コンテナーがエラーを生成すると、それが保存され、新しい例外も生成されます。
注: デフォルトでは、ほとんどのメッセージのタイプは ERROR です。
注: 演算子が throw されると、値は割り当てられず、スタックは削除されます。つまり、例外をスローすると、すべての情報が失われます。
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 ());
}
このライブラリには空の値を処理する 4 つの異なる方法があります。
$ 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.
また、条件をバイパスして、欠損値 (null または空) を受け入れる方法が 4 つあります。
$ 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
場合によっては、常に結果をトリミングしたいことがあります。したがって、このメソッドを使用して常に結果をトリミングできます。変換の最後にスタックされます。