Validação
O Validator é uma classe de validação de dados que ajuda a minimizar a quantidade de código que você precisará escrever.
Validando
Validando POST:
use Inphinit\Experimental\Utility\Validator;
$validator = Validator::post();
$validator->field('name', $name, 'required|min:5|max:15|regex:/^\S+$/');
$validator->field('surname', $surname, 'min:5|max:50');
// strings como yes, true e 1 retornam bool(true)
// strings como no, false e 0 retornam bool(false)
// Outros valores retornam null
$validator->field('active', $active, 'required|bool');
if ($validator->valid()) {
echo 'Nome: ', htmlentities($name);
if ($surname !== null) {
echo ' ', htmlentities($surname);
}
echo '<br>';
echo $active ? '✔️' : '❌';
} else {
foreach ($validator->failures() as $failure) {
echo '<div class="error"><p>', $failure, '</p></div>';
}
}
Validando GET:
use Inphinit\Experimental\Utility\Validator;
$validator = Validator::get();
$validator->field('query', $query, 'min:5');
$validator->field('type', $type, 'in:electronics,motors,fashion,sports');
$validator->field('sold', $sold, 'bool');
if ($validator->valid()) {
...
}
Validando Arrays e JSONs
use Inphinit\Experimental\Utility\Validator;
$arr = [
'foo' => [
'bar' => [
'baz' => '...',
]
]
];
$validator = new Validator($arr);
$validator->field('foo.bar.baz', $phone, 'required|regex:/^(?:55)?([1-9]{2})(9?[2-9]\d{3}\d{4})$/');
if ($validator->valid()) {
...
}
use Inphinit\Http\Request;
use Inphinit\Experimental\Utility\Validator;
$app->action('POST', '/receive', function () {
$body = file_get_contents('php://input');
if (strlen($body) < 1) {
Request::status(400);
return 'Invalid request';
}
$decoded = json_decode($body, true);
if (json_last_error() !== JSON_ERROR_NONE || is_array($body) === false) {
Request::status(400);
return 'Invalid body';
}
$validator = new Validator($decoded);
...
});
Regras de validação
Antes de validar, os valores são convertidos para string:
| Regra | Combinações | Descrição |
|---|---|---|
bool |
Pode ser combinado com in e required |
Valores de string como yes, true, 1, no, false e 0 |
decimal |
Pode ser combinado com in, regex, min, max e required |
Valida se o campo recebeu uma string de numeração decimal. O separador pode ser ajustado usando:
decimal:., decimal:,, decimal:'
|
digit |
Pode ser combinado com in, regex, min, max e required |
Valida se o campo recebeu uma string escrita como numero inteiro |
email |
Pode ser combinado com in, regex, min, max e required |
Valida URL usando FILTER_VALIDATE_EMAIL
|
in: |
Pode ser combinado com in, regex, min, max e required
|
Verifica se o valor do campo é um dos valores da lista, exemplo: in:foo,bar,baz |
ip |
Pode ser combinado com in, regex, min, max e required |
Valida URL usando FILTER_VALIDATE_IP
|
max:<n> |
Se usado com decimal e digit, irá comparar diretamente com o valor do campo:
campo <= max; para as outras regras irá comparar com a quantidade caracteres:
strlen(campo) <= max
|
|
min:<n> |
Se usado com decimal e digit, irá comparar diretamente com o valor do campo:
campo >= min; para as outras regras irá comparar com a quantidade caracteres:
strlen(campo) >= min
|
|
regex:<n> |
Valida o campo com uma expressão regular customizada, examplo: regex:/^[A-Z]+$/
|
|
required |
Pode ser combinado com todas regras | Torna o campo em obrigatório |
url |
Pode ser combinado com in, regex, min, max e required
|
Valida URL usando FILTER_VALIDATE_URL e verificando se o esquema é https ou http
|
Customizando as mensagens
Por padrão as mensagens de falha vem em inglês, mas é possivel modifica-las, e configura-las com qualquer sistema de idiomas que usar, como por exemplo Gettext.
O primeiro %s contém o nome ou o caminho do campo. Quanto às mensagens que contêm mais de um %s, seguem as explicações:
| Mensagem | Padrão | Nota |
|---|---|---|
bool |
%s can have values such as Yes, True, 1, No, False, and 0 |
|
decimal |
%s expects a decimal format |
|
digit |
%s expects a digit format |
|
email |
%s expects a valid email |
|
in |
%s has an unexpected value |
|
ip |
%s expects a valid IP |
|
max |
%s expects a maximum %s of %s |
O segundo %s representa o tipo e o terceiro o valor máximo |
min |
%s expects a minimum %s of %s |
O segundo %s representa o tipo e o terceiro o valor minimo |
regex |
%s does not match the expected format |
|
required |
%s is required |
|
type |
%s contains an unexpected type |
|
unicode_error |
%s contains invalid Unicode characters |
Não faz parte da validação, mas em casos que um campo tem caracteres com problema, isso é tratado com uma das falhas, ao invés de uma exceção, para evitar quebras. |
url |
%s expects a valid url |
Exemplo de customização com gettext:
$validator = Validator::post();
$validator->setMessage('bool', _('boolId'));
$validator->setMessage('decimal', _('decimalId'));
$validator->setMessage('digit', _('digitId'));
$validator->setMessage('email', _('emailId'));
$validator->setMessage('in', _('inId'));
$validator->setMessage('ip', _('ipId'));
$validator->setMessage('max', _('maxId'));
$validator->setMessage('min', _('minId'));
$validator->setMessage('regex', _('regexId'));
$validator->setMessage('required', _('requiredId'));
$validator->setMessage('type', _('typeId'));
$validator->setMessage('unicode_error', _('unicode_errorId'));
$validator->setMessage('url', _('urlId'));
O arquivo .po deve conter algo como:
msgid "boolId"
msgstr "O valor deve ser yes ou no."
msgid "decimalId"
msgstr "O valor deve ser um número decimal."