Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

tocho

Validar Formulários com OOP

Recommended Posts

Estou fazendo alguns códigos que vão ser padrões para meu desenvolvimento, por exemplo: Uma Classe para conexão, paginação, imagem, etc..etc..

 

Embora num futuro próximo eu queira usar um framework, quero primeiramente me familiarizar bem com o PHP e sua sintaxe, além é claro de ter uma boa base em OOP.

 

No código abaixo eu vou tentar explicar como estou fazendo minha validação:

 

$validacao = array( //CAMPOS A SEREM VALIDADOS
	'login'	   => true,
	'senha'	   => true,
);

if (empty($_POST['login'])) {
	 $validation['login']   = false;
} elseif (empty($_POST['senha'])) {
	 $validation['login']   = false;
} else { //PASSOU POR TODAS AS VALIDAÇÕES
	 $login = New Login($_POST['login'], $_POST['senha']);
	 $login->Redireciona();
}

 // ISSO AQUI É LIXO, PENSE...PENSE...PENSE
 function verificaValidacao($validacao) { // SE ALGUM CAMPO ESTIVER ERRO, RETORNA FALSO
	  foreach ( $validacao as $i ) {
		  if ( $i == false ) {
			  return false;
		  }
	  }
	  return true;
  }  


<html>
<head></head>

<body>

<?php if (verificaValidacao($validacao) == false):  // SE EXISTIR VALIDACAO ?>
<div id="msg_erro">
<?php	if ($validacao['login'] == false) {  echo "<p>- É preciso preencher login.</p>"; } ?>
...
...
</div>
<?php endif; ?>

</body>
</html>

 

Acho que vocês conseguem entender, espero eu..rsrsr, o código, minha idéia foi controlar as validações em cima, e só jogar as mensagens de erro dentro do <body>, mas isso ficou muito ruim, de péssima qualidade.

 

Eu to pensando numa classe para fazer as validações, sei lá, algo mais limpo e simples. Adorei o modo que o RAILS fez, alguém tem alguma idéia interessante de validações com PHP e OOP?

Compartilhar este post


Link para o post
Compartilhar em outros sites

é por aí...

 

comece automatizando os processos do HTTP_REQUEST

crie uma classe para extrair os dados, de uma forma que não precise mexer mais ou fazer gambiarras

 

 

um exemplo simples.

 

<?php

class Request
{

	function Extract( $method = false, $parameter = false )
	{

		if( isset( $_SERVER['REQUEST_METHOD'] ) )
		{

			if( $method != 'FILES' )
			{
				$mthd = '_' . strtoupper( $_SERVER['REQUEST_METHOD'] );
	
				if( $method and '_' . strtoupper( $method ) != $mthd )
				{
					return false;
				}
			}else{
				$mthd = '_' . $method;
			}

			global $$mthd;
			$dt = $$mthd;

			if( is_array( $dt ) and count( $dt ) > 0 )
			{

				if( $parameter )
				{

					if( isset( $dt[$parameter] ) )
					{

						return $dt[$parameter];

					}

				}else{

					return $dt;

				}

			}

		}

		return false;

	}


}

/* exemplos de uso:

// exemplo 1
// resgatando todos os dados recebidos via método POST
$data = new Request::Extract( 'POST' );


// exemplo 2
// resgatando todos os dados recebidos via método GET
$data = new Request::Extract( 'GET' );


// exemplo 3
// resgatando um único parâmetro recebido via método POST
$data = new Request::Extract( 'POST', 'foo' );

// exemplo 4
// resgatando um único parâmetro recebido via método GET
$data = new Request::Extract( 'GET', 'foo' );


// exemplo 5
//se $data retornar FALSE, significa que não recebeu nada.
if( $data = new Request::Extract( 'POST' ) )
{
	// recebeu algo
}else{
	// não recebeu nada
}

*/

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

o que seria esse duplo cifrão antes da variável? nunk usei e faz um tempinho que uso POO, não tenho mta pratica pq meu chefe não quer que a gnt use no projeto, o pq ele nunk falou... to tentando brinca com isso sozinho xD...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso são variaveis variáveis...

 

$nome = 'thiago';

$$nome = 'aluno';

 

Com isso eu crio uma variável chamada $thiago contendo o valor aluno

Compartilhar este post


Link para o post
Compartilhar em outros sites

a idéia desse script acima, é economizar essas chamadas:

 

if(empty($_POST['login'])) {
ou

if(empty($_GET['login'])) {

ou quando há situações em que pode chamar pelos dois métodos GET e POST

 

if( isset($_REQUEST['login']) ){

autiomatiza também a extração para todos os parâmetros recebidos

chamando o método apenas uma vez, armazenando tudo num array, pois afinal, a superglobal "REQUEST" é um array

 

a validação pode ser feita a partir de um conjunto unico de regra estrutural

 

exemplo. preparando conjunto de regras:

 

<?php

class ModuleHome extends Controller
{

	function Form( )
	{

		return array(
		'foo' => 
			array(
				label => 'Nome',
				type  => 'text',
				size => 25,
				maxLength => 20,
				minLength => 3,
				required => true,
				validation => 'varchar',
			),

		'email' => 
			array(
				label => 'E-mail',
				type  => 'text',
				size => 50,
				maxLength => 120,
				minLength => 6,
				required => true,
				validation => 'email',
			),
		);

		//return null;

	}

}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

a idéia desse script acima, é economizar essas chamadas:

 

if(empty($_POST['login'])) {
ou

if(empty($_GET['login'])) {

ou quando há situações em que pode chamar pelos dois métodos GET e POST

 

if( isset($_REQUEST['login']) ){

autiomatiza também a extração para todos os parâmetros recebidos

chamando o método apenas uma vez, armazenando tudo num array, pois afinal, a superglobal "REQUEST" é um array

 

a validação pode ser feita a partir de um conjunto unico de regra estrutural

 

exemplo. preparando conjunto de regras:

 

<?php

class ModuleHome extends Controller
{

	function Form( )
	{

		return array(
		'foo' => 
			array(
				label => 'Nome',
				type  => 'text',
				size => 25,
				maxLength => 20,
				minLength => 3,
				required => true,
				validation => 'varchar',
			),

		'email' => 
			array(
				label => 'E-mail',
				type  => 'text',
				size => 50,
				maxLength => 120,
				minLength => 6,
				required => true,
				validation => 'email',
			),
		);

		//return null;

	}

}

?>

Estava em viagem e não pude olhar a resposta. O pessoal aqui está em alto nível hein !!!

 

Essa classe com os conjuntos de regras, poderiam no caso "EXTENDS" a classe REQUEST?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para pegar todos os campos automaticamente e ainda por cima se precisar você pode aplicar algum função ou fazer uma validação

 

exemplo:

 

foreach ($_POST as $key => $value){$$key = addslashes(trim($value));}

 

nesse exemplo apenas peguei os campos vindos do formulario e apliquei as funções addslashes e trim

 

mas nada impede nesse loop ja fazer uma validação, por exemplo se o campo tiver vazio ele ja retornar false e pedir para o usuario digitar aquele campo

 

outra função relacionadas

 

import_request_variables

http://br.php.net/manual/pt_BR/function.im...t-variables.php

 

extract

http://br.php.net/manual/pt_BR/function.extract.php

 

e com framework fica mais facil ainda = )

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para pegar todos os campos automaticamente e ainda por cima se precisar você pode aplicar algum função ou fazer uma validação

 

exemplo:

 

foreach ($_POST as $key => $value){$$key = addslashes(trim($value));}

nesse exemplo apenas peguei os campos vindos do formulario e apliquei as funções addslashes e trim

 

mas nada impede nesse loop ja fazer uma validação, por exemplo se o campo tiver vazio ele ja retornar false e pedir para o usuario digitar aquele campo

 

outra função relacionadas

 

import_request_variables

http://br.php.net/manual/pt_BR/function.im...t-variables.php

 

extract

http://br.php.net/manual/pt_BR/function.extract.php

 

e com framework fica mais facil ainda = )

 

Como eu uso PDO para salvar os dados, não iria precisar da função addslashes certo?

 

Minha maior dúvida é como fazer as duas classes desse post conversarem entre si, Request e ModuleHome.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Minha maior dúvida é como fazer as duas classes desse post conversarem entre si, Request e ModuleHome

ModuleHome está herdando de "controller"

 

na classe Controller, inicialize as instanciações

coloque um autoload, para carregar librarys somente no momento que chamá-las

 

 

class Controller{

	function __autoload( $class_name ) {
		require_once LIB_DIR . $class_name . FILE_EXTENSION;
	}

}

 

LIB_DIR e FILE_EXTENSION são constantes,

defina as contantes em outro arquivo, "config.php", por exemplo

 

pode aproveitar o Controller também para declarar os métodos "GETTERS & SETTERS"

 

para chamar request

 

$rs = new Request;
$form = $rs -> Extract();

$form receberá todos os dados de REQUEST, não importa se for via GET ou POST

 

se quiser, pode especificar, somente POST

 

$rs = new Request;
$form = $rs -> Extract( 'POST' );

um parâmetro específico via POST

$rs = new Request;
$form = $rs -> Extract( 'POST', 'foo' );

 

um parâmetro específico via POST ou GET

$rs = new Request;
$form = $rs -> Extract( false, 'foo' );

 

isso serve apenas para obter os dados de request

 

para a parte de filtragem e aplicação de regras para os dados, crie uma classe chamada .. "form"

 

exemplo

 

 

class Form
{
	// bla bla bla

	function validation( $data )
	{

		 // aqui faz os tratamentos

		 foreach( $data as $k => $v )
		 {

			  // verfica o tipo de validação (definido dentro do método "Form()" do Módulo  )
			  switch( $v['validation'] )
			  {

				  case 'varchar':
					  // 1. quantidade mínima de caracteres
					  // 2. quantidade máxima de caracteres
				  break;

				  case 'email':
					  // 2. verifica se a string possui formato de email válido
				  break;

			  }

		 }

	}


}

 

em ModuleHome, adicione um método chamado "Prepare"

 

class ModuleHome extends Controller
{

	function Form()
	{

		  // bla bla ...

	}


	function Prepare()
	{

		 // aqui faz chamada para abstrair, validar os dados, executar funções, banco de dados, etc..

		$frm = new Form;
		$frm -> Validation( $this -> Form() );

	}

}

 

obs: está bagunçado a explicação, pois começamos já no miolo do aplicativo

não sei se você está conseguindo captar

 

o ideal é começar criando sua estrutura de diretórios e fazer definição das constantes e chamadas de métodos e classes.

 

dê uma olhada nos frameworks pequenos, pois se pegar os maiores ficará confuso pra entender.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Minha maior dúvida é como fazer as duas classes desse post conversarem entre si, Request e ModuleHome

ModuleHome está herdando de "controller"

 

na classe Controller, inicialize as instanciações

coloque um autoload, para carregar librarys somente no momento que chamá-las

 

 

class Controller{

	function __autoload( $class_name ) {
		require_once LIB_DIR . $class_name . FILE_EXTENSION;
	}

}

 

LIB_DIR e FILE_EXTENSION são constantes,

defina as contantes em outro arquivo, "config.php", por exemplo

 

pode aproveitar o Controller também para declarar os métodos "GETTERS & SETTERS"

 

para chamar request

 

$rs = new Request;
$form = $rs -> Extract();

$form receberá todos os dados de REQUEST, não importa se for via GET ou POST

 

se quiser, pode especificar, somente POST

 

$rs = new Request;
$form = $rs -> Extract( 'POST' );

um parâmetro específico via POST

$rs = new Request;
$form = $rs -> Extract( 'POST', 'foo' );

 

um parâmetro específico via POST ou GET

$rs = new Request;
$form = $rs -> Extract( false, 'foo' );

 

isso serve apenas para obter os dados de request

 

para a parte de filtragem e aplicação de regras para os dados, crie uma classe chamada .. "form"

 

exemplo

 

 

class Form
{
	// bla bla bla

	function validation( $data )
	{

		 // aqui faz os tratamentos

		 foreach( $data as $k => $v )
		 {

			  // verfica o tipo de validação (definido dentro do método "Form()" do Módulo  )
			  switch( $v['validation'] )
			  {

				  case 'varchar':
					  // 1. quantidade mínima de caracteres
					  // 2. quantidade máxima de caracteres
				  break;

				  case 'email':
					  // 2. verifica se a string possui formato de email válido
				  break;

			  }

		 }

	}


}

 

em ModuleHome, adicione um método chamado "Prepare"

 

class ModuleHome extends Controller
{

	function Form()
	{

		  // bla bla ...

	}


	function Prepare()
	{

		 // aqui faz chamada para abstrair, validar os dados, executar funções, banco de dados, etc..

		$frm = new Form;
		$frm -> Validation( $this -> Form() );

	}

}

 

obs: está bagunçado a explicação, pois começamos já no miolo do aplicativo

não sei se você está conseguindo captar

 

o ideal é começar criando sua estrutura de diretórios e fazer definição das constantes e chamadas de métodos e classes.

 

dê uma olhada nos frameworks pequenos, pois se pegar os maiores ficará confuso pra entender.

 

É, está um pouco confuso mesmo, vou tentar olhar alguns frameworks, embora ainda não queira usá-los, mas é muito fascinante isso.

 

Vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.