Es una biblioteca PHP para recuperar y validar campos y almacenar mensajes en diferentes contenedores (incluidos errores, advertencias, información y éxito) según las condiciones.
La ideología detrás de esta biblioteca es simple: 3 clases, dependencias simples y se ejecuta en PHP 7.1 y superior, por lo que podría ejecutarse en prácticamente cualquier proyecto PHP, incluidos WordPress, Laravel, proyecto PHP central, etc.
Ejemplos
Tutorial de formulario y tabla con PHP
Es un ejemplo de funcionalidad. Un ejemplo típico es más complejo, incluso si son sólo unas pocas líneas de código.
Digamos que queremos validar un valor de entrada (obtener) llamado "id", podríamos hacer lo siguiente:
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
Pero ¿dónde está el error?. Los mensajes se almacenan en 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.
Sin embargo, también podríamos mostrar un mensaje por tipo (error, advertencia...) y solo mensaje por un identificador específico.
var_dump ( $ val -> messageList -> get ( ' id ' )-> allErrorOrWarning ()); // All error or warning contained in the key "id".
¿Por qué los mensajes se almacenan en alguna estructura? ¿No es fácil simplemente devolver el error?
Una respuesta es una forma. Digamos que tenemos un formulario con tres campos. Si uno de ellos falla, el error debe ser visible para cada campo por separado. Además, todo el formulario podría tener su propio mensaje.
El inicio de la cadena normalmente se escribe al final del código.
Los métodos permitidos son:
Ejemplo:
$ 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']
condición ($condición, $mensaje = "", $condiciónValue = nulo, $nivel = 'error', $clave = nulo)
Agrega una condición que depende del tipo de entrada.
@param cadena $condición
número :req,eq,ne,gt,lt,gte,lte,entre,null,notnull
cadena :req,eq,ne,minlen,maxlen,betweenlen,null,notnull,contain,notcontain,alpha,alphanum,text,regexp,email,url,domain
fecha :req,eq,ne,gt,lt,gte,lte,entre
cadena de fecha :req,eq,ne,gt,lt,gte,lte,entre
booleano :req,eq,ne,verdadero,falso
archivo : tamaño mínimo, tamaño máximo, req, imagen, doc, compresión, arquitectura, ext
función:
fn.static.Class.methodstatic
función.fn.global
fn.object.Class.method donde el objeto es un objeto $ global
fn.clase.método.de.clase
fn.clase.espacio de nombresClase.método
@param cadena $mensaje
El mensaje podría usar las siguientes variables '%field','%realfield','%value','%comp','%first','% second'
Campo | Descripción | Ejemplo |
---|---|---|
%campo | nombre del campo, podría ser el friendid o el nombre real | ID de cliente |
% campo real | nombre del campo (no el friendid ) | Identificador de cliente |
%valor | valor actual del campo | John |
%comp | valor a comparar (si corresponde) | |
%primero | primer valor a comparar (si el valor de comparación es una matriz) | |
%segundo | segundo valor a comparar (si el valor de comparación es una matriz) | |
%llave | clave utilizada (para matriz de entrada) |
@param nulo $condiciónValor
@param cadena $nivel (error,advertencia,información,éxito). El nivel del error. Consulte MessageContainer para obtener más información.
@param string $key Si la clave no es nula, entonces se usa para agregar más de una condición por clave
@return ValidationOne
Nota: si el valor es nulo y isNullValid() es verdadero, entonces se ignoran las condiciones. Si falta el valor y isMissingValid() es verdadero, entonces se ignoran las condiciones. Si el valor está vacío ('') y isEmptyValid() es verdadero, entonces se ignoran las condiciones. Si el valor está vacío ('') o nulo y isNullOrEmptyValid() es verdadero, entonces se ignoran las condiciones. isNullValid(),isMissingValid(),isNullOrEmptyValid() e isEmptyValid() son útiles cuando queremos validar un valor solo si existe o si el valor está establecido.
Ejemplo:
$ 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 ' );
tipo | descripción |
---|---|
entero | (numérico) permite un número sin decimal |
tiempo unix | (numérico) permite un número sin decimal |
booleano | (booleano) almacena verdadero o falso. La entrada puede variar (vacía, cero o nula = falsa, en caso contrario es verdadera) |
decimal | (numérico) permite un número con decimal |
flotar | (numérico) permite un número con decimal |
varchar | (cadena) permite cualquier entrada |
cadena | (cadena) permite cualquier entrada |
fecha | (fecha) la entrada podría ser una fecha y hora o una cadena. El valor se almacena como un objeto DateTime |
fecha y hora | (fecha) la entrada podría ser una fecha y hora o una cadena. El valor se almacena como un objeto DateTime |
cadena de fecha | (fecha) la entrada podría ser una fecha y hora o una cadena. El valor se almacena como una cadena. |
cadena de fecha y hora | (fecha) la entrada podría ser una fecha y hora o una cadena. El valor se almacena como una cadena. |
archivo | (archivo) la entrada es una cadena y se almacena como una cadena, pero agrega una validación especial |
Tipo de entrada | Condición | |
---|---|---|
número | gt,lt,gte,lte,entre | |
cadena | minlen,maxlen,entrelen,contiene ,no contiene,alfa,alphanum,texto,regexp,correo electrónico,url,dominio | |
fecha | gt,lt,gte,lte,entre | |
cadena de fecha | gt,lt,gte,lte,entre | |
booleano | verdadero, falso | |
archivo | minsize,maxsize,req,imagen,doc,compresión,arquitectura,ext | |
*(aplica para cualquier tipo) | req,eq,ne,nulo,no nulo,vacío,no vacío | |
* | función | |
* | fn.static.Class.methodstatic | |
* | función.fn.global | |
* | fn.object.Class.method donde el objeto es un objeto $ global | |
* | fn.clase.método.de.clase | |
* | fn.clase.espacio de nombresClase.método |
Condición | Descripción | Ejemplo de valor |
---|---|---|
arquitectura | La extensión del archivo debe ser un archivo de arquitectura (dwg, etc.) | |
entre | El número debe estar entre dos valores. | [0,20] |
entrelen | La longitud del texto debe estar entre dos valores. | [0,20] |
compresión | La extensión del archivo debe ser un archivo comprimido. | |
contener | El texto debe contener un valor. | "texto" |
doc | La extensión del archivo debe ser un archivo de documento. | |
eq (podría ser una matriz o un valor) / == | El valor debe ser igual a El valor debe estar contenido en una matriz. | "texto",["texto","texto2"] |
existir | El archivo o valor debe existir (podría ser nulo/vacío) | |
faltante / no existe | El archivo o valor no debe existir o ser nulo/vacío | |
requerido (o requerido) | El valor no debe ser nulo o vacío. | |
extensión | La extensión (archivo) debe estar en la lista de extensiones. | ["ext1","ext2","ext3"] |
FALSO | El valor debe ser falso (===falso) | |
fn.clase.espacio de nombresClase.método | El método de una clase debe devolver verdadero. | |
fn.clase.método.de.clase | El método de una clase debe devolver verdadero. | |
función.fn.global | La función global debe devolver verdadero | |
fn.object.Class.method donde el objeto es un objeto $ global | El método de un objeto global debe devolver verdadero. | |
fn.static.Class.methodstatic | El método estático de una clase debe devolver verdadero | |
función | La función debe devolver verdadero | |
gt/> | El valor debe ser mayor que | 123 |
gte / >= | El valor debe ser mayor o igual que | 123 |
imagen | La extensión del archivo debe ser un archivo de imagen. | |
l / < | El valor debe ser menor que | 123 |
lte/<= | El valor debe ser menor o igual que | 123 |
maxlen | La longitud máxima de una cuerda. | 123 |
tamaño máximo | El tamaño máximo de un archivo. | 123 |
minlen | La longitud mínima de una cuerda. | 123 |
tamaño mínimo | El tamaño mínimo de un archivo. | 123 |
mime (el valor a comparar podría ser una cadena o una matriz) | El tipo mime de un archivo | "aplicación/msword" o ["aplicación/msword","image/gif"] |
tipo mime | El tipo mime (sin subtipo) de un archivo | "aplicación" o ["aplicación,"imagen"] |
ne / != (el valor a comparar podría ser un valor único o una matriz) | El valor no debe ser igual. O el valor no debe estar contenido en una matriz. | 123,[123,345],["aa","bb"] |
no contener | El valor no debe contener un valor. | "texto" |
no nulo | El valor no debe ser nulo. | |
nulo | El valor debe ser nulo. | |
vacío | El valor debe estar vacío (es decir, "",0,nulo) | |
no tentado | El valor no debe estar vacío (es decir, no debe ser igual a "",0,null) | |
req | El valor debe existir. | |
verdadero | El valor debe ser verdadero (===verdadero) |
Ejemplos:
$ 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 ;
}
A veces necesitamos usar una condición personalizada. Podríamos crear una variable global, una función estática o incluso un método dentro de una clase.
Cada método o función creada debe tener dos parámetros (con cualquier nombre):
Por ejemplo, ¿qué pasa si necesitamos evaluar si alguna identificación no existe en la base de datos?
$ 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 ;
}
}
Nota: si necesitamos especificar un espacio de nombres, entonces podríamos usar la notación: 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
}
}
Cuando validamos un objeto, este podría almacenar la información dentro del Contenedor de mensajes (también llamado Lista de mensajes).
MessageContainer (EFTEC/MessageContainer) contiene una lista de mensajes en forma jerárquica:
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.
Los mensajes están nivelados de la siguiente manera
identificación | Descripción | Ejemplo |
---|---|---|
error | El mensaje es un error y hay que solucionarlo. Es nuestro tapón del espectáculo. | La base de datos está caída |
advertencia | El mensaje es una advertencia de que tal vez podría ignorarse. Sin embargo, la clase MessageContainer permite agrupar Error y Advertencia como lo mismo. | El registro fue almacenado pero con advertencias. |
información | El mensaje es información. Por ejemplo, para registrar o depurar una operación. | El registro está almacenado |
éxito | El mensaje es una operación exitosa. | Pedido aceptado |
Función | Descripción | Ejemplo |
---|---|---|
addMessage($idLocker, $mensaje, $nivel = 'error') | Agrega un mensaje dentro de un casillero. Por lo general, la biblioteca lo hace automáticamente, pero puede agregar mensajes manualmente mediante código. | $this->addMessage('pwd','la contraseña es requerida','error'); |
getMessage($conAdvertencia = falso) | Recibe el primer mensaje de error o está vacío si no hay ninguno. | $this->getMessage(); |
getMessages ($ con advertencia = falso) | Recibe todos los mensajes de error o está vacío si ninguno | $this->getMessages(); |
getMessageId($idLocker) | Obtiene un objeto MessageLocker (consulte EFTEC/MessageContainer para obtener más información) | $obj=$this->getMessageId('contraseña'); |
errorCount(includeWarning=false) | Obtiene el recuento de errores | $cuenta=$this->errorCount(); |
tieneError($includeWarning=false) | Devuelve verdadero si hay un error | $fail=$this->hasError(); |
Campo | Descripción | Ejemplo |
---|---|---|
$listademensajes | Obtiene todo el contenedor. Devuelve un objeto del tipo MessageContainer | $contenedor=$this->listademensajes; |
Puedes ver más información sobre MessageContainer en EFTEC/MessageContainer
Ejemplo:
$ 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.
También podríamos trabajar con fechas. Hay varios tipos de formatos de fecha.
tipo | descripción |
---|---|
fecha | (fecha) la entrada podría ser una fecha y hora o una cadena. El valor se almacena como un objeto DateTime |
fecha y hora | (fecha) la entrada podría ser una fecha y hora o una cadena. El valor se almacena como un objeto DateTime |
cadena de fecha | (fecha) la entrada podría ser una fecha y hora o una cadena. El valor se almacena como una cadena usando el campo $dateOutputString |
cadena de fecha y hora | (fecha) la entrada podría ser una fecha y hora o una cadena. El valor se almacena como una cadena usando el campo $dateLongOutputString |
Hay dos formas de especificar el formato de las fechas, corta (solo fecha) y larga (fecha y hora). Y podríamos especificar el formato como entrada y salida.
Campo de nombre | Descripción | Valor predeterminado |
---|---|---|
$ fecha corta | Es el formato de entrada (esperado) para la fecha (corta) | d/m/Y |
$ fecha larga | Es el formato de entrada (esperado) (con fecha y hora) | d/m/YH:i:s |
$ fechaSalidaCadena | Es el formato de salida (para cadena de fechas) | ymd |
$dateLongOutputString | Es el formato de salida (para cadena de fecha y hora) | 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
Podemos cambiar el formato de fecha cambiando los campos o llamando a las siguientes funciones
Configuración del formato de las fechas (entrada corta, entrada larga, salida corta y salida larga)
$ validation -> setDateFormat ( ' m/d/Y ' , ' m/d/Y H:i:s ' , ' Y-m-d ' , ' Y-m-dTH:i:sZ ' )
Establecemos el formato de las fechas a la configuración por defecto
$ validation -> setDateFormatDefault ();
Configuramos el formato de las fechas para:
Nombre | Formato |
---|---|
entrada corta | m/d/A |
entrada larga | m/d/YH:i:s |
salida corta | ymd |
salida larga | YmdTH:i:sZ |
$ validation -> setDateFormatEnglish ()
De forma predeterminada, esta biblioteca no genera excepciones. Sin embargo, es posible generar excepciones si el mensaje es del tipo ERROR y/o WARNING.
Con este método, si el contenedor genera un error, luego se almacena y también genera una nueva excepción.
Nota: De forma predeterminada, la mayoría de los mensajes son del tipo ERROR.
Nota: Cuando se lanza el operador, entonces no se asigna el valor y se elimina la pila, es decir, si lanzamos una excepción, se pierde toda la información.
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 ());
}
Hay cuatro formas diferentes de manejar valores vacíos en esta biblioteca.
$ 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.
Además, hay 4 formas de aceptar valores faltantes, nulos o vacíos, sin pasar por ninguna condición.
$ 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
Se usa cuando necesitamos validar cuando una entrada tiene algún valor a menos que el valor falte, esté vacío o sea nulo.
isNullorEmptyValid() es igual a llamar: isEmptyValid()->isNullValid()
Además, esos operadores podrían apilarse.
$ validation
-> isNullorEmptyValid ()
-> isMissingValid ()
-> condition (... . )
-> set (... . ); // this expression is valid if the value is null, empty(''), the value is missing, no matter the conditions.
Podríamos establecer un valor predeterminado. Este valor podría servir como respaldo cuando hay un error. El valor predeterminado nunca se convierte ni se procesa.
$ validation
-> def (- 1 )
-> type ( ' integer ' )
-> ifFailThenDefault ()
-> set (...); // if the operation fails, then it returns -1
Recorta el resultado. De forma predeterminada, el resultado no se recorta. Puedes recortar el lado izquierdo, derecho o ambos. Utiliza el método convert() para realizar la operación.
$ 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
A veces, siempre queremos recortar los resultados. Entonces podríamos usar este método para recortar siempre el resultado. Se acumula al final de la conversión.