Olá, tudo bem?!
Todas aplicações que desenvolvemos necessita de entradas e saídas de dados, isso é muito comum, porém cada desenvolvedor acaba implementando a “sua solução” para esse problema. Definitivamente essa não é uma boa prática por diversos motivos.
O mais recomendado é a utilização de componentes criados pela comunidade, porque devo usar um componente? Simples, irei listar algumas das principais vantagens, sendo:
- Grande volume de contribuidores.
- Maior correção de bugs.
- Implementações de melhorias contantes.
- Solução robusta.
- Testada por diversos usuários (programadores).
O componente zend-validator#
Neste post irei apresentar um poderoso componente criado pela Zend e mantido pela comunidade, seu nome é zend-validator.
Ele suporta uma lista de validadores, que cobre grande parte das nossas necessidades do dia a dia, a seguir podemos observar a lista de validadores.
- Validadores
- Barcode
- Between
- Callback
- CreditCard
- Date
- Db\RecordExists and Db\NoRecordExists
- Digits
- EmailAddress
- Explode
- GreaterThan
- Hex
- Hostname
- Iban
- Identical
- InArray
- Ip
- Isbn
- IsCountable
- IsInstanceOf
- LessThan
- NotEmpty
- Regex
- Sitemap
- Step
- StringLength
- Timezone
- Uri
- Uuid
- File Validators
- Intro
- Count
- Crc32
- ExcludeExtension
- ExcludeMimeType
- Exists
- Extension
- FilesSize
- Hash
- ImageSize
- IsCompressed
- IsImage
- Md5
- MimeType
- NotExists
- Sha1
- Size
- Upload
- UploadFile
- WordCount
Como podemos observar, o componente dispõem de uma vasta lista a nossa disposição. Caso ocorra de não conter um validador que você necessite, pode ser criado validadores, eu mesmo criei um pacote validators_zf, responsável por validar CPF, CNPJ e Data (pt-BR).
Demonstração prática#
Será implementado uma estrutura simples, para que possamos realizar a validação dos dados submetidos por meio de um formulário.
Lembrando que neste exemplo utilizaremos um formulário, porém os princípios são os mesmos para validar qualquer entrada de dados.
Vamos emular o seguinte cenário, sendo:
- Teremos um formulário com nome, e-mail, e idade.
- Ao realizar o submit (POST) devemos capturar e validar cada input.
- Após validação devemos analisar o resultado.
- Regras de validação para cada input.
- nome
- Máximo de caracteres 150.
- Mínimo de caracteres 05.
- Campo obrigatório.
- email
- Máximo de caracteres 200.
- Mínimo de caracteres 10.
- Campo obrigatório.
- Deve ser um e-mail válido.
- idade
- Entre 0 e 120 anos.
- Campo obrigatório.
- Deve aceitar somente números.
Para agilizar a realização do projeto, faça o download da estrutura base que preparei diegobrocanelli-post-zend-validator.
- diegobrocanelli-post-zend-validator
- src
- view
- composer.json
- index.php
Após download realizado, descompacte o projeto no diretório desejado, acesse sua raiz pelo terminal e execute o comando abaixo para validação do projeto:
1
| php -S localhost:8080 index.php
|
Após execução do servidor embutido do PHP, acesse um navegador de sua preferência inserindo a seguinte URL, sendo:
Estou utilizando a versão 7.2 do PHP, porém a adaptação para projetos inferiores é simples. Neste pacote que foi realizado o download já consta os componentes devidamente instalados, onde pode ser observado no arquivo composer.json
.
No arquivo composer.json
foi definido a namespace base DiegoBrocanelli
, utilizaremos ela para criar nossa classe de validação mais a frente.
Abra o projeto no seu editor de preferencia e acesse a classe src/Validator/User.php
.
Devemos definir a namespace
da classe, para isso insira o seguinte código.
1
2
3
| <?php
namespace DiegoBrocanelli\Validator;
|
Agora deve ser importado os pacotes que serão utilizados, sendo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| // Componente base.
use Zend\InputFilter\InputFilter;
// Responsável por filtrar os dados para inteiro.
use Zend\Filter\ToInt;
// Responsável por filtrar tags HTML.
use Zend\Filter\StripTags;
// Responsável por remover espaços no início e fim da string.
use Zend\Filter\StringTrim;
// Responsável por validar intervalo entre valores.
use Zend\Validator\Between;
// Responsável por validar o e-mail.
use Zend\Validator\EmailAddress;
// Responsável por validar o comprimento da string.
use Zend\Validator\StringLength;
|
Deve-se ser declarado a estrutura da classe, sendo:
1
2
3
4
5
6
7
8
9
10
11
12
13
| /**
* Responsável por validar os dados de usuário
*
* @author Diego Brocanelli <contato@diegobrocanelli.com.br>
*/
class User extends Inputfilter
{
// Será por meio do construtor que iremos consumir os validadores.
public function __construct()
{
// Será implementado aqui a estrutura de validação.
}
}
|
Após a criação do método construtor, será implementado o primeiro validador referente ao para o campo nome, para isso como a classe User
herda a classe InputFilter
a mesma dispões do método add()
onde será definido o validador .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| // Validador do campo nome.
$this->add([
'name' => 'nome', // Defini o nome do campo esperado (deve ser igual ao do input do form).
'required' => true, // defini se o campo é obrigatório TRUE ou não FALSE.
'filters' => [ // Dentro desse array é onde definimos todos os filtros desejados
[ 'name' => StringTrim::class ], // Filtro para remoção de espaços em branco.
[ 'name' => StripTags::class ], // Filtro para remoção de tags HTML.
],
'validators' => [ // dentro desse array é inserido todos os validadores desejado.
[
'name' => StringLength::class,
'options' => [
'encoding' => 'UTF-8', // Aqui é definido o encoding da string
'min' => 5, // aqui é definido o mínimo de caracteres desejado.
'max' => 150, // aqui é definido o máximo de caracteres permitido
],
],
],
]);
|
Devemos agora implementar o validador para campo de e-mail.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| // Validador do campo email.
$this->add([
'name' => 'email', // Defini o nome do campo esperado (deve ser igual ao do input do form).
'required' => true, // defini se o campo é obrigatório TRUE ou não FALSE.
'filters' => [ // Dentro desse array é onde definimos todos os filtros desejados
[ 'name' => StringTrim::class ], // Filtro para remoção de espaços em branco.
[ 'name' => StripTags::class ], // Filtro para remoção de tags HTML.
],
'validators' => [ // dentro desse array é inserido todos os validadores desejado.
[
'name' => StringLength::class,
'options' => [
'encoding' => 'UTF-8', // Aqui é definido o encoding da string
'min' => 5, // aqui é definido o mínimo de caracteres desejado.
'max' => 150, // aqui é definido o máximo de caracteres permitido
],
],
[
'name' => EmailAddress::class, // Aqui é difinido o validador de e-mail
],
],
]);
|
Por último, implementar o validador para o campo idade.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| <?php
// Validador do campo idade.
$this->add([
'name' => 'idade', // Defini o nome do campo esperado (deve ser igual ao do input do form).
'required' => true, // defini se o campo é obrigatório TRUE ou não FALSE.
'filters' => [ // Dentro desse array é onde definimos todos os filtros desejados
[ 'name' => StringTrim::class ], // Filtro para remoção de espaços em branco.
[ 'name' => StripTags::class ], // Filtro para remoção de tags HTML.
],
'validators' => [ // dentro desse array é inserido todos os validadores desejado.
[
'name' => Between::class,
'options' => [
'encoding' => 'UTF-8', // Aqui é definido o encoding da string
'min' => 0, // aqui é definido o valor mínimo.
'max' => 120, // aqui é definido o valor máximo.
],
],
],
]);
|
Como resultado a implementação deve ficar semelhante ao apresentado abaixo, sendo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
| <?php
namespace DiegoBrocanelli\Validator;
// Componente base.
use Zend\InputFilter\InputFilter;
// Responsável por filtrar os dados para inteiro.
use Zend\Filter\ToInt;
// Responsável por filtrar tags HTML.
use Zend\Filter\StripTags;
// Responsável por remover espaços no início e fim da string.
use Zend\Filter\StringTrim;
// Responsável por validar intervalo entre valores.
use Zend\Validator\Between;
// Responsável por validar o e-mail.
use Zend\Validator\EmailAddress;
// Responsável por validar o comprimento da string.
use Zend\Validator\StringLength;
/**
* Responsável por validar os dados de usuário
*
* @author Diego Brocanelli <contato@diegobrocanelli.com.br>
*/
class User extends Inputfilter
{
// Será por meio do construtor que iremos consumir os validadores.
public function __construct()
{
// Validador do campo nome.
$this->add([
'name' => 'nome', // Defini o nome do campo esperado (deve ser igual ao do input do form).
'required' => true, // defini se o campo é obrigatório TRUE ou não FALSE.
'filters' => [ // Dentro desse array é onde definimos todos os filtros desejados
[ 'name' => StringTrim::class ], // Filtro para remoção de espaços em branco.
[ 'name' => StripTags::class ], // Filtro para remoção de tags HTML.
],
'validators' => [ // dentro desse array é inserido todos os validadores desejado.
[
'name' => StringLength::class,
'options' => [
'encoding' => 'UTF-8', // Aqui é definido o encoding da string
'min' => 5, // aqui é definido o mínimo de caracteres desejado.
'max' => 150, // aqui é definido o máximo de caracteres permitido
],
],
],
]);
// Validador do campo email.
$this->add([
'name' => 'email', // Defini o nome do campo esperado (deve ser igual ao do input do form).
'required' => true, // defini se o campo é obrigatório TRUE ou não FALSE.
'filters' => [ // Dentro desse array é onde definimos todos os filtros desejados
[ 'name' => StringTrim::class ], // Filtro para remoção de espaços em branco.
[ 'name' => StripTags::class ], // Filtro para remoção de tags HTML.
],
'validators' => [ // dentro desse array é inserido todos os validadores desejado.
[
'name' => StringLength::class,
'options' => [
'encoding' => 'UTF-8', // Aqui é definido o encoding da string
'min' => 5, // aqui é definido o mínimo de caracteres desejado.
'max' => 150, // aqui é definido o máximo de caracteres permitido
],
],
[
'name' => EmailAddress::class, // Aqui é difinido o validador de e-mail
],
],
]);
// Validador do campo idade.
$this->add([
'name' => 'idade', // Defini o nome do campo esperado (deve ser igual ao do input do form).
'required' => true, // defini se o campo é obrigatório TRUE ou não FALSE.
'filters' => [ // Dentro desse array é onde definimos todos os filtros desejados
[ 'name' => StringTrim::class ], // Filtro para remoção de espaços em branco.
[ 'name' => StripTags::class ], // Filtro para remoção de tags HTML.
],
'validators' => [ // dentro desse array é inserido todos os validadores desejado.
[
'name' => Between::class,
'options' => [
'encoding' => 'UTF-8', // Aqui é definido o encoding da string
'min' => 0, // aqui é definido o valor mínimo.
'max' => 120, // aqui é definido o valor máximo.
],
],
],
]);
}
}
|
Apos implementação da camada de validação, será implementado as regras no arquivo index.php
para consumo da classe de validação.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| <?php
// importação do autoload.
require_once __DIR__.'/vendor/autoload.php';
// inport do componente de validação.
use DiegoBrocanelli\Validator\User;
// capturo o conteúdo do form.html
$view = file_get_contents(__DIR__.'/view/form.html');
// recuperar o mehod da rquest
$request = filter_input(INPUT_SERVER, 'REQUEST_METHOD');
// somente requisição POST
if($request === 'POST'){
$nome = filter_input(INPUT_POST, 'nome');
$email = filter_input(INPUT_POST, 'email');
$idade = filter_input(INPUT_POST, 'idade');
// realizado a criação do objeto User
$validator = new User();
// Por meio do método setData, é passado um array com os valores a serem validados.
// as keys devem ser as mesmas configuradas no validator.
$validator->setData([
'nome' => $nome,
'email' => $email,
'idade' => $idade,
]);
// Por meio do método isValid(), é validado os dados informados.
if(!$validator->isValid()){
// O método getMessages() é o responsável por retornar as mensagens de erro do input.
var_dump($validator->getMessages());
}
}
// responsável por renderizar o formulário.
echo $view;
|
Basicamente é se a request é POST, em seguida capturamos os valores do formulário.
Em seguida é instanciado o validador User
e por meio do método setData()
passado os valores obtidos do formulário.
Para validar os dados basta chamar o método isValid()
do validador.
Para recuperar as mensagens de erro deve ser utilizado o método getMessages()
.
O projeto encontra-se finalizado e pronto para seu uso.
1
| php -S localhost:8080 index.php
|
Considerações finais#
Pudemos observar na prática como foi simples criar a camada de validação e consumi-lo.
As mensagens por padrão são em inglês, é possível traduzi-las de forma automática, caso tenham interesse deixem nos comentários.
Podemos também somar o uso do validator com o zend-form e zend-view, onde por exemplo as mensagens de erro já são inseridos abaixo do seu respectivo input.
Validar dados é fundamental e toda aplicação necessita de ser feita, com o zend validator essa tarefa fica muito mas simples e descomplicada.
Agradeço pela atenção, espero que o conteúdo do post agregue valor em seu dia a dia.
Até a próxima e sucesso nos projetos.