É uma biblioteca PHP para buscar e validar campos e armazenar mensagens em diferentes contêineres (incluindo erro, aviso, informação e sucesso) dependendo das condições.
A ideologia por trás desta biblioteca é simples: 3 classes, dependências simples e roda em PHP 7.1 e superior, então pode rodar em praticamente qualquer projeto PHP, incluindo WordPress, Laravel, projeto PHP principal, etc.
Exemplos
Tutorial Formulário e Tabela com PHP
É um exemplo de funcionalidade. Um exemplo típico é mais complexo, mesmo que contenha apenas algumas linhas de código.
Digamos que queremos validar um valor de entrada (get) chamado "id", poderíamos fazer o seguinte:
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
Mas onde está o erro? As mensagens são armazenadas em 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.
Porém, também poderíamos mostrar uma mensagem por tipo (erro, aviso..) e apenas uma mensagem por um identificador específico.
var_dump ( $ val -> messageList -> get ( ' id ' )-> allErrorOrWarning ()); // All error or warning contained in the key "id".
Por que as mensagens são armazenadas em alguma estrutura? Não é fácil simplesmente retornar o erro?
Uma resposta é um formulário. Digamos que temos um formulário com três campos. Se um deles falhar, o erro deverá ficar visível para cada campo separadamente. Além disso, todo o formulário pode ter sua própria mensagem.
O início da cadeia geralmente está escrito no final do código.
Os métodos permitidos são:
Exemplo:
$ 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']
condição ($condição, $mensagem = "", $conditionValue = null, $level = 'erro', $key = null)
Ele adiciona uma condição que depende do tipo de entrada.
@param string $condição
número :req,eq,ne,gt,lt,gte,lte,entre,nulo,nãonulo
string :req,eq,ne,minlen,maxlen,betweenlen,null,notnull,contain,notcontain ,alpha,alphanum,text,regexp,email,url,domain
data :req,eq,ne,gt,lt,gte,lte,entre
string de data :req,eq,ne,gt,lt,gte,lte,entre
booleano :req,eq,ne,verdadeiro,falso
arquivo :minsize,maxsize,req,imagem,doc,compressão,arquitetura,ext
função:
fn.static.Class.methodstatic
fn.global.função
fn.object.Class.method onde object é um objeto $ global
fn.class.Class.método
fn.class.namespaceClass.método
@param string $ mensagem
A mensagem pode usar as próximas variáveis '%field','%realfield','%value','%comp','%first','%second'
Campo | Descrição | Exemplo |
---|---|---|
%campo | nome do campo, pode ser o friendid ou o nome real | ID do cliente |
%campo real | nome do campo (não o friendid ) | Identificador do cliente |
%valor | valor atual do campo | John |
%comp | valor para comparar (se houver) | |
%primeiro | primeiro valor a comparar (se o valor de comparação for uma matriz) | |
%segundo | segundo valor para comparar (se o valor de comparação for uma matriz) | |
%chave | chave usada (para array de entrada) |
@param null $conditionValue
@param string $level (erro, aviso, informação, sucesso). O nível do erro. Consulte MessageContainer para obter mais informações
@param string $key Se a chave não for nula, ela será usada para adicionar mais de uma condição por chave
@return ValidationOne
Nota: se o valor for nulo e isNullValid() for verdadeiro, as condições serão ignoradas. Se o valor estiver faltando e isMissingValid() for verdadeiro, as condições serão ignoradas. Se o valor estiver vazio ('') e isEmptyValid() for verdadeiro, as condições serão ignoradas. Se o valor estiver vazio ('') ou nulo e isNullOrEmptyValid() for verdadeiro, as condições serão ignoradas. isNullValid(),isMissingValid(),isNullOrEmptyValid() e isEmptyValid() são úteis quando queremos validar um valor apenas se ele existir ou se o valor estiver definido.
Exemplo:
$ 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 | descrição |
---|---|
inteiro | (numérico) permite um número sem decimal |
horário unix | (numérico) permite um número sem decimal |
booleano | (booleano) armazena verdadeiro ou falso. A entrada pode variar (vazia, zero ou nula = falsa, caso contrário, verdadeira) |
decimal | (numérico) permite um número com decimal |
flutuador | (numérico) permite um número com decimal |
varchar | (string) permite qualquer entrada |
corda | (string) permite qualquer entrada |
data | (data) a entrada pode ser um DateTime ou uma string. O valor é armazenado como um objeto DateTime |
datahora | (data) a entrada pode ser um DateTime ou uma string. O valor é armazenado como um objeto DateTime |
data | (data) a entrada pode ser um DateTime ou uma string. O valor é armazenado como uma string |
string de data e hora | (data) a entrada pode ser um DateTime ou uma string. O valor é armazenado como uma string |
arquivo | (arquivo) a entrada é uma string e é armazenada como uma string, mas adiciona validação especial |
Tipo de entrada | Doença | |
---|---|---|
número | gt, lt, gte, lte, entre | |
corda | minlen, maxlen, entrelen, contém ,notcontain,alfa,alfanum,texto,regexp,e-mail,url,domínio | |
data | gt, lt, gte, lte, entre | |
data | gt, lt, gte, lte, entre | |
booleano | verdadeiro, falso | |
arquivo | minsize,maxsize,req,imagem,doc,compressão,arquitetura,ext | |
* (aplica-se a qualquer tipo) | req,eq,ne,nulo,nãonulo,vazio,noempty | |
* | função | |
* | fn.static.Class.methodstatic | |
* | fn.global.função | |
* | fn.object.Class.method onde object é um objeto $ global | |
* | fn.class.Class.método | |
* | fn.class.namespaceClass.método |
Doença | Descrição | Exemplo de valor |
---|---|---|
arquitetura | A extensão do arquivo deve ser um arquivo de arquitetura (dwg, etc.) | |
entre | O número deve estar entre dois valores | [0,20] |
entrelen | O comprimento do texto deve estar entre dois valores | [0,20] |
compressão | A extensão do arquivo deve ser um arquivo compactado | |
conter | O texto deve conter um valor | "texto" |
documento | A extensão do arquivo deve ser um arquivo de documento | |
eq (pode ser um array ou valor) / == | O valor deve ser igual a O valor deve estar contido em uma matriz | "texto",["texto","texto2"] |
existir | O arquivo ou valor deve existir (pode ser nulo/vazio) | |
faltando / não existe | O arquivo ou valor não deve existir ou ser nulo/vazio | |
necessário (ou req) | O valor não deve ser nulo ou vazio | |
ramal | A extensão (arquivo) deve estar na lista de extensões | ["ext1","ext2","ext3"] |
falso | O valor deve ser falso (===falso) | |
fn.class.namespaceClass.método | O método de uma classe deve retornar verdadeiro | |
fn.class.Class.método | O método de uma classe deve retornar verdadeiro | |
fn.global.função | A função global deve retornar verdadeiro | |
fn.object.Class.method onde object é um objeto $ global | O método de um objeto global deve retornar verdadeiro | |
fn.static.Class.methodstatic | O método estático de uma classe deve retornar verdadeiro | |
função | A função deve retornar verdadeiro | |
gt / > | O valor deve ser maior que | 123 |
gte / >= | O valor deve ser maior ou igual a | 123 |
imagem | A extensão do arquivo deve ser um arquivo de imagem | |
lt / < | O valor deve ser menor que | 123 |
lte / <= | O valor deve ser menor ou igual a | 123 |
maxlen | O comprimento máximo de uma string | 123 |
tamanho máximo | O tamanho máximo de um arquivo | 123 |
minlen | O comprimento mínimo de uma string | 123 |
tamanho mínimo | O tamanho mínimo de um arquivo | 123 |
mime (o valor a ser comparado pode ser uma string ou array) | O tipo MIME de um arquivo | "aplicativo/msword" ou ["aplicativo/msword","imagem/gif"] |
tipo MIME | O tipo mime (sem subtipo) de um arquivo | "aplicativo" ou ["aplicativo,"imagem"] |
ne /!= (o valor a ser comparado pode ser um único valor ou matriz) | O valor não deve ser igual. Ou o valor não deve estar contido em uma matriz | 123,[123.345],["aa","bb"] |
não conter | O valor não deve conter um valor | "texto" |
não nulo | O valor não deve ser nulo | |
nulo | O valor deve ser nulo | |
vazio | O valor deve estar vazio (ou seja, "",0,null) | |
nada vazio | O valor não deve estar vazio (ou seja, não é igual a "",0,null) | |
solicitação | O valor deve existir | |
verdadeiro | O valor deve ser verdadeiro (===verdadeiro) |
Exemplos:
$ 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 ;
}
Às vezes precisamos usar uma condição personalizada. Poderíamos criar uma variável global, uma função estática ou até mesmo um método dentro de uma classe.
Todo método ou função criada deve ter dois parâmetros (com qualquer nome):
Por exemplo, e se precisarmos avaliar se algum id não existe no Banco de Dados?
$ 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: se precisarmos especificar um namespace, poderemos usar a notação: 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
}
}
Quando validamos um objeto, ele pode armazenar as informações dentro do Message Container (também chamado de Message List).
MessageContainer (EFTEC/MessageContainer) contém uma lista de mensagens de forma hierá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.
As mensagens são niveladas da seguinte forma
eu ia | Descrição | Exemplo |
---|---|---|
erro | A mensagem é um erro e deve ser resolvida. É o nosso empecilho. | O banco de dados está inativo |
aviso | A mensagem é um aviso de que talvez possa ser ignorada. Porém, a classe MessageContainer permite agrupar Error e Warning como iguais. | O registro foi armazenado, mas com avisos |
informações | A mensagem é informação. Por exemplo, para registrar ou depurar uma operação. | O registro é armazenado |
sucesso | A mensagem é uma operação bem-sucedida | Pedido aceito |
Função | Descrição | Exemplo |
---|---|---|
addMessage($idLocker, $mensagem, $nível = 'erro') | Adiciona uma mensagem dentro de um armário. Normalmente isso é feito automaticamente pela biblioteca, mas você pode adicionar mensagens manualmente via código. | $this->addMessage('pwd','a senha é obrigatória','erro'); |
getMessage($comAviso=falso) | Recebe a primeira mensagem de erro ou fica vazio se não houver | $this->getMessage(); |
getMessages($withWarning = falso) | Ele recebe todas as mensagens de erro ou fica vazio se nenhuma | $this->getMessages(); |
getMessageId($idLocker) | Ele obtém um objeto MessageLocker (consulte EFTEC/MessageContainer para obter mais informações) | $obj=$this->getMessageId('pwd'); |
contagem de erros(includeWarning=false) | Obtém a contagem de erros | $count=$this->errorCount(); |
hasError($includeWarning=falso) | Ele retorna verdadeiro se houver um erro | $fail=$this->hasError(); |
Campo | Descrição | Exemplo |
---|---|---|
$ lista de mensagens | Ele pega todo o contêiner. Retorna um objeto do tipo MessageContainer | $container=$this->messageList; |
Você pode ver mais informações sobre MessageContainer em EFTEC/MessageContainer
Exemplo:
$ 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.
Também poderíamos trabalhar com datas. Existem vários tipos de formatos de data.
tipo | descrição |
---|---|
data | (data) a entrada pode ser um DateTime ou uma string. O valor é armazenado como um objeto DateTime |
datahora | (data) a entrada pode ser um DateTime ou uma string. O valor é armazenado como um objeto DateTime |
data | (data) a entrada pode ser um DateTime ou uma string. O valor é armazenado como uma string usando o campo $dateOutputString |
string de data e hora | (data) a entrada pode ser um DateTime ou uma string. O valor é armazenado como uma string usando o campo $dateLongOutputString |
Existem duas maneiras de especificar o formato das datas: curta (somente data) e longa (data e hora). E poderíamos especificar o formato como entrada e saída.
Campo Nome | Descrição | Valor padrão |
---|---|---|
$data curta | É o formato de entrada (esperado) para data (abreviada) | d/m/A |
$data longa | É o formato de entrada (esperado) (com data e hora) | d/m/YH:i:s |
$dateOutputString | É o formato de saída (para datestring) | sim |
$dateLongOutputString | É o formato de saída (para datetimestring) | SimTH: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 alterar o formato da data alterando os campos ou chamando as próximas funções
Configurando o formato das datas (entrada curta, entrada longa, saída curta e saída longa)
$ validation -> setDateFormat ( ' m/d/Y ' , ' m/d/Y H:i:s ' , ' Y-m-d ' , ' Y-m-dTH:i:sZ ' )
Definimos o formato das datas para a configuração padrão
$ validation -> setDateFormatDefault ();
Definimos o formato das datas para:
Nome | Formatar |
---|---|
entrada curta | m/d/A |
entrada longa | m/d/YH:i:s |
saída curta | sim |
saída longa | SimTH:i:sZ |
$ validation -> setDateFormatEnglish ()
Por padrão, esta biblioteca não gera exceções. Porém, é possível gerar exceções se a mensagem for do tipo ERROR e/ou WARNING.
Com este método, se o contêiner gerar um erro, ele será armazenado e também gerará uma nova exceção.
Nota: Por padrão, a maioria das mensagens é do tipo ERRO.
Nota: Quando o operador é lançado, o valor não é atribuído e a pilha é excluída, ou seja, se lançarmos uma exceção, todas as informações são perdidas.
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 ());
}
Existem quatro maneiras diferentes de lidar com valores vazios nesta 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.
Além disso, existem 4 maneiras de aceitar valores ausentes, nulos ou vazios, ignorando qualquer condição.
$ 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
É usado quando precisamos validar quando uma entrada possui algum valor, a menos que o valor esteja ausente, vazio ou nulo.
isNullorEmptyValid() é igual a chamar: isEmptyValid()->isNullValid()
Além disso, esses operadores poderiam ser empilhados.
$ validation
-> isNullorEmptyValid ()
-> isMissingValid ()
-> condition (... . )
-> set (... . ); // this expression is valid if the value is null, empty(''), the value is missing, no matter the conditions.
Poderíamos definir um valor padrão. Este valor pode ser um substituto quando há um erro. O valor padrão nunca é convertido ou processado.
$ validation
-> def (- 1 )
-> type ( ' integer ' )
-> ifFailThenDefault ()
-> set (...); // if the operation fails, then it returns -1
Corte o resultado. Por padrão, o resultado não é cortado. Você pode cortar o lado esquerdo, direito ou ambos os lados. Ele usa o método convert() para fazer a operação.
$ 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
Às vezes, sempre queremos cortar os resultados. Portanto, poderíamos usar este método para sempre cortar o resultado. Ele acumula no final da conversão.