chamado ZUUF. O ZUUF é apenas um conjunto de classes independentes que tem por
objetivo, servir como base para a criação de frameworks.
Eu vou apresentá-las na medida do possível e quero começar hoje pela
classe de validação: ZUUF\Validator. Todas as classes ZUUF são completamente
independentes, sendo assim, vocês podem utilizá-las em projetos a partir do
início ou projetos já em andamento, sem restrições quanto a frameworks.
Essas classes vem sendo criadas baseadas em uma funcionalidade do PHP 5.3:
namespaces. Não há muito segredo, mas estou pressupondo que vocês já sabem
trabalhar com esse recurso.
O ZUUF\Validator é bem simples. Ele é constituída de apenas uma classe e seu
código não passa de 30 linhas de código útil (tirando gets e sets e quebras de
linhas desnecessárias). No entanto, é de um poder enorme se bem utilizado.
Então vamos começar.
Baixem o código em: http://pastebin.com/CMMYgb44
Vamos a alguns conceitos dessa ferramenta. Nós primeiro registramos os "campos"
e atrelamos a eles as "validações". Um campo pode ter mais de uma validação.
Então quando eu tiver o dado a ser validado em mãos, eu apenas digo que campo
esse dado representa e as validações desse campo, serão feitas a esse dado.
Ficou confuso, né?
Vamos a um exemplo prático. Imaginem um formulário com os campos nome e idade.
Vamos imaginar as validações que podemos precisar vazer nos campos.
Campo nome:
* Deve ter entre 1 e 20 caracteres
* Deve conter apenas letras (maiúsculas ou minúsculas), espaços e pontos
Campo idade:
* Deve ser maior que 18
* Deve conter apenas números
Ok. Já entendemos a definição de campos (nome e idade) e de validações (linhas
com asterisco). O próximo passo seria registrar essas regras no ZUUF\Validator
e então, quando precisássemos validar um valor vindo pela variável
$_POST['nome'] por exemplo, nós diríamos que esse valor será validado com as
regras do campo "nome", registrado anteriormente.
Algo que o torna flexível, é que as funções para validação são vocês quem criam.
Uma validação no Validator, nada mais é que uma referência a função que será
utilizada para validar e a mensagem que será retornada caso o valor seja
inválido.
Vamos a um pouco de código.
Para começar, vamos criar um arquivo index.html e colocar nele um formulário
com os campos nome e idade. Esse formulário vai submeter para index.php:
index.html
<form action="index.php" method="post" > Nome: <input type="text" name="nome" /><br /> Idade: <input type="text" name="idade" /> <input type="submit" /> </form>
Como havia mencionado antes, as funções para validação, quem cria somos nós, o
ZUUF\Validator apenas irá chamá-las. Então vamos começar criando uma simples
função que vai validar o número de caracteres e vamos testa-la:
index.php
<?php function caracteres1a20($nome) { $n = strlen($nome); if($n < 1 || $n > 20) return false; else return true; } if(!caracteres1a20($_POST['nome'])) echo 'Nome deve conter entre 1 e 20 caracteres';
Se submetermos o formulário com o campo nome vazio ou com mais de 20
caracteres, ele vai mostrar a mensagem: "Nome deve conter entre 1 e 20
caracteres". Até aqui beleza.
O problema de se fazer isso aparece quando temos que fazer mais de uma
validação. Começamos a encher nosso código de if...else até que ninguém acha
mais nada ali dentro.
Vamos ver como esse mesmo código ficaria com o ZUUF\Validator:
index.php
<?php require_once 'validator.php'; function caracteres1a20($nome) { $n = strlen($nome); if($n < 1 || $n > 20) return false; else return true; } $validator = new ZUUF\Validator; $validator->add_field('nome', array('caracteres1a20', 'Nome deve conter entre 1 e 20 caracteres')); if(!$validator->is_valid_one('nome', $_POST['nome'])) print_r($validator->get_messages());
Nós adicionamos o campo "nome" e atribuímos a ele o nome da função que
validaria e a mensagem caso fosse inválido. is_valid_one retorna true ou false
e em caso de retornar false, get_messages vai retornar as mensagens de erro em
um array.
Vamos tornar nossa função um pouco mais dinâmica, fazendo-a receber como
parametro o número mínimo e máximo de caracteres e então passaríamos esses
valores ao definir a validação para o campo. Segue o código:
index.php
<?php require_once 'validator.php'; function largura($palavra, $min = 0, $max = null) { $largura_palavra = strlen($palavra); if($max === null) { if($largura_palavra < $min) return false; } else if($largura_palavra < $min || $largura_palavra > $max) return false; return true; } $validator = new ZUUF\Validator; $validator->add_field('nome', array('largura', array(1, 20), 'Nome deve conter entre 1 e 20 caracteres')); if(!$validator->is_valid_one('nome', $_POST['nome'])) print_r($validator->get_messages());
Percebam que renomeei a função para largura. Essa nova função é bem simples. Se
receber apenas o valos mínimo, valida apenas pelo mínimo. Se receber os dois,
valida pelos dois. Para passar os parâmetros na validação, apenas passe-os
dentro de um array, na segunda posição, como no código.
Um exemplo validando também as letras no nome:
index.php
<?php require_once 'validator.php'; function largura($palavra, $min = 0, $max = null) { $largura_palavra = strlen($palavra); if($max === null) { if($largura_palavra < $min) return false; } else if($largura_palavra < $min || $largura_palavra > $max) return false; return true; } function letras($palavra) { if(preg_match('%^[a-zA-Z \.]*$%', $palavra)) return true; else return false; } $validator = new ZUUF\Validator; $validator->add_field('nome', array('largura', array(1, 20), 'Nome deve conter entre 1 e 20 caracteres')); $validator->add_field('nome', array('letras', 'Deve conter apenas letras (maiúsculas ou minúsculas), espaços e pontos')); if(!$validator->is_valid_one('nome', $_POST['nome'])) print_r($validator->get_messages());
Quando se precisa validar mais de um campo por vez, o ZUUF\Validator trás uma
facilidade com a função is_valid_all. Vejam o exemplo com o campo idade:
index.php
<?php require_once 'validator.php'; function largura($palavra, $min = 0, $max = null) { $largura_palavra = strlen($palavra); if($max === null) { if($largura_palavra < $min) return false; } else if($largura_palavra < $min || $largura_palavra > $max) return false; return true; } function letras($palavra) { if(preg_match('%^[a-zA-Z \.]*$%', $palavra)) return true; else return false; } function numeros($palavra) { if(preg_match('%^[0-9]*$%', $palavra)) return true; else return false; } function minimo($valor, $min = 0) { if($valor < $min) return false; else return true; } $validator = new ZUUF\Validator; $validator->add_field('nome', array('largura', array(1, 20), 'Nome deve conter entre 1 e 20 caracteres')); $validator->add_field('nome', array('letras', 'Deve conter apenas letras (maiúsculas ou minúsculas), espaços e pontos')); $validator->add_field('idade', array('minimo', array(18), 'Idade deve ser maior que 18')); $validator->add_field('idade', array('numeros', 'Deve conter apenas números')); if(!$validator->is_valid_all(array('nome' => $_POST['nome'], 'idade' => $_POST['idade']))) print_r($validator->get_messages());
O método is_valid_all retorna os dados um pouco diferente. Retorna um array onde a chave é o nome
do campo e o valor, é o array com as mensagens de erro. Então você decide como apresentá-las. Aqui
segue um exemplo mais enxuto de como utilizar essa classe para o que fizemos:
index.php
<?php require_once 'validator.php'; function rg($valor, $min = 0, $max = null) {//range de falores if($max === null) { if($valor < $min) return false; } else if($valor < $min || $valor > $max) return false; return true; } function largura($palavra, $min = 0, $max = null) { return rg(strlen($palavra), $min, $max); } function alpha($palavra) { if(preg_match('%^[a-zA-ZãÃáÁàÀêÊéÉèÈíÍìÌôÔõÕóÓòÒúÚùÙûÛçÇ \.]*$%', $palavra)) return true; else return false; } function numeros($palavra) { if(preg_match('%^[0-9]*$%', $palavra)) return true; else return false; } function regex($palavra, $regex) { if(preg_match("%$regex%", $palavra)) return true; else return false; } $validator = new ZUUF\Validator; $validator->add_field('nome', array('largura', array(1, 20), 'Nome deve conter entre 1 e 20 caracteres')); $validator->add_field('nome', array('alpha', 'Deve conter apenas letras (maiúsculas ou minúsculas), espaços e pontos')); $validator->add_field('idade', array('rg', array(18), 'Idade deve ser maior que 18')); $validator->add_field('idade', array('regex', array('^[0-9]*$'), 'Deve conter apenas números')); if(!$validator->is_valid_all(array('nome' => $_POST['nome'], 'idade' => $_POST['idade']))) print_r($validator->get_messages());
Neste exemplo ainda criei a função regex para mostrar como essa classe pode se tornar extensível.
Um útimo exemplo serve para mostrar mais uma possíbilidade. Imaginem que eu quero mostrar uma
mensagem caso a pessoa tenha digitado uma idade menor que 18 e outra mensagem caso ela tenha
digitado um valor maior que 30.
index.php
<?php require_once 'validator.php'; function rg($valor, $min = 0, $max = null) {//range de falores if($max === null) { if($valor < $min) return false; } else if($valor < $min || $valor > $max) return false; return true; } $validator = new ZUUF\Validator; $validator->add_field('idade', array('rg', array(18), 'Idade deve ser maior que 18')); $validator->add_field('idade', array('rg', array(null, 30), 'Idade deve ser menor que 30')); if(!$validator->is_valid_one('idade', $_POST['idade'])) print_r($validator->get_messages());
Percebam que as possibilidades agora dependem da criatividade com as funções. Para deixar mais
organizado, poderiam criar um arquivo apenas com as funções para validação e incluí-los sempre que
usar a classe ZUUF\Validator.
Se preferirem criar classes com as validações, lembrem-se que quando estamos passando o nome da
função, estamos passando um callback. Para passar um método de classe ou de objeto, basta passar
ali o callback da maneira correta. Ex: array($obj, 'metodo'). Vide manual do php para mais exemplos.
Acho que é isso. Deixem comentários.