它是一个 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
有时,我们总是想修剪结果。所以我们可以使用这个方法来始终修剪结果。它在转换结束时堆叠。