микрозаймы онлайн займы на карту займы по паспорту

Criando um Validator Customizado CNPJ e CPF 9

Ao participar de um projeto utilizando Frameworks, vão surgindo algumas necessidades especificas e que não são atendidas diretamente pelo framework, é ai então que surge a necessidade de Customização. Seguindo essa linha, estou em um projeto onde tive a necessidade de criar um validator especifico para validar CPFs e CNPJs.

(Laravel 3)
Primeiramente criei um arquivo dentro de application/libraries com o nome de “validator.php“.

Em seguida vamos codar, abra o arquivo criado e adicione o código a seguir.

<?php
class Validator extends Laravel\Validator {

    public function validate_cpf($attribute, $value, $parameters)
    {
        /*
         * Salva em $cpf apenas numeros, isso permite receber o cpf em diferentes formatos,
         * como "000.000.000-00", "00000000000", "000 000 000 00"
         */
        $cpf = preg_replace('/\D/', '', $value);
        $num = array();

        /* Cria um array com os valores */
        for($i=0; $i<(strlen($cpf)); $i++) {

            $num[]=$cpf[$i];
        }

        if(count($num)!=11) {
            return false;
        }else{
        	/*
			Combinações como 00000000000 e 22222222222 embora
			não sejam cpfs reais resultariam em cpfs
			válidos após o calculo dos dígitos verificares e
			por isso precisam ser filtradas nesta parte.
        	*/
        	for($i=0; $i<10; $i++)
			{
				if ($num[0]==$i && $num[1]==$i && $num[2]==$i
			     && $num[3]==$i && $num[4]==$i && $num[5]==$i
			     && $num[6]==$i && $num[7]==$i && $num[8]==$i)
					{
						return false;
						break;
					}
			}
        }
        /*
		Calcula e compara o
		primeiro dígito verificador.
		*/
        $j=10;
        for($i=0; $i<9; $i++)
            {
                $multiplica[$i] = $num[$i]*$j;
                $j--;
            }
        $soma = array_sum($multiplica);
        $resto = $soma%11;
        if($resto<2)
            {
                $dg=0;
            }
        else
            {
                $dg=11-$resto;
            }
        if($dg!=$num[9])
            {
                return false;
            }
        /*
		Calcula e compara o
		segundo dígito verificador.
		*/
        $j=11;
        for($i=0; $i<10; $i++)
            {
                $multiplica[$i]=$num[$i]*$j;
                $j--;
            }
        $soma = array_sum($multiplica);
        $resto = $soma%11;
        if($resto<2)
            {
                $dg=0;
            }
        else
            {
                $dg=11-$resto;
            }
        if($dg!=$num[10])
            {
                return false;
            }
        else
            {
                return true;
            }
    }

    public function validate_cnpj($attribute, $value, $parameters)
    {

		/*
		Etapa 1: Cria um array com apenas os digitos numéricos,
		isso permite receber o cnpj em diferentes
		formatos como "00.000.000/0000-00", "00000000000000", "00 000 000 0000 00"
		etc...
		*/
	    $cnpj = preg_replace('/\D/', '', $value);
 		$num = array();

        /* Cria um array com os valores */
        for($i=0; $i<(strlen($cnpj)); $i++) {

            $num[]=$cnpj[$i];
        }

		 //Etapa 2: Conta os dígitos, um Cnpj válido possui 14 dígitos numéricos.
		 if(count($num)!=14)
		 {
			 return false;
		 }
		 /*
		 Etapa 3: O número 00000000000 embora não seja um cnpj real resultaria
		 um cnpj válido após o calculo dos dígitos verificares
		 e por isso precisa ser filtradas nesta etapa.
		 */
		 if ($num[0]==0 && $num[1]==0 && $num[2]==0
		 	 && $num[3]==0 && $num[4]==0 && $num[5]==0
		 	 && $num[6]==0 && $num[7]==0 && $num[8]==0
		 	 && $num[9]==0 && $num[10]==0 && $num[11]==0)
		 {
			 return false;
		 }
		 //Etapa 4: Calcula e compara o primeiro dígito verificador.
		 else
		 {
			 	$j=5;
			 	for($i=0; $i<4; $i++)
			 	{
			 		$multiplica[$i]=$num[$i]*$j;
			 		$j--;
			 	}
			 	$soma = array_sum($multiplica);
			 	$j=9;
			 	for($i=4; $i<12; $i++)
			 	{
			 		$multiplica[$i]=$num[$i]*$j;
			 		$j--;
			 	}
			 	$soma = array_sum($multiplica);
			 	$resto = $soma%11;
				 if($resto<2)
				 {
					 $dg=0;
				 }
				 else
				 {
				 	$dg=11-$resto;
				 }
				 if($dg!=$num[12])
				 {
				 	return false;
				 }
		}
		 //Etapa 5: Calcula e compara o segundo dígito verificador.

		 $j=6;
		 for($i=0; $i<5; $i++)
		 {
			 $multiplica[$i]=$num[$i]*$j;
		 	 $j--;
		 }
		 $soma = array_sum($multiplica);
		 $j=9;
		 for($i=5; $i<13; $i++)
		 {
		 	$multiplica[$i]=$num[$i]*$j;
		 	$j--;
		 }
		 $soma = array_sum($multiplica);
		 $resto = $soma%11;
		 if($resto<2)
		 {
		 	$dg=0;
		 }
		 else
		 {
		 	$dg=11-$resto;
		 }
		 if($dg!=$num[13])
		 {
		 	return false;
		 }
		 else
		 {
		 	return true;
		 }

	}
}

Visualizando o inicio do arquivo, vocês perceberam que nós estendemos o Validator principal do framework utilizando o namespace + classe.

class Validator extends Laravel\Validator

Após o arquivo criado, inicializamos a inserção dos métodos de Validação, todos os methodos inseridos seguem o padrão de implementação, onde o mesmo deve ser iniciado com a palavra “validate_” + nome do método que você estiver criando, seguido das variáveis utilizadas para a validação.

validate_cnpj($attribute, $value, $parameters)

para utilizar o método em sua validação é necessário somente adicionar as regras de validação os valores abaixo.

//Regras
$rules = array(
    'cpf' => 'required|cpf',//ou
    'cnpj' => 'required|cnpj', //Caso o required seja removido a validação acontece somente quando o campo é preenchido.
);

//Mensagens
$mensagens = array(
    'cpf_cpf' => 'O campo cpf é inválido',
    'cnpj_cnpj' => 'O campo cnpj é inválido'
);

//ou adicionar aos arquivos da pasta Languages.
'cpf' => 'O campo :attribute é inválido',
'cnpj' => 'O campo :attribute é inválido'

E agora para finalizar e utilizar o seu Validator customizado, vá até o arquivo application/config/application.php e comente a seguinte linha:

//'Validator'  	=> 'Laravel\\Validator',

(Laravel 4)
https://github.com/illuminate


No Laravel 4 ainda não pesquisei como realizar a mesma tarefa, percebi que os metodos de validação estão inicializados com o “validate” + nome do método (Com iniciais maiúsculas), ex: validateUnique.

Para quem quiser dar uma olhada mais a fundo:
https://github.com/illuminate/validation/blob/master/Validator.php

É o meu primeiro post sobre Laravel, caso o post possua algum erro ou alguma outra forma de faze-lo melhor, gostaria que fosse compartilhado, pois estamos sempre em busca de conhecimento.

Qualquer dúvida, estou a disposição.
https://plus.google.com/u/0/112101739663216187961/posts
ou me envie um email no GMAIL

——————————————————————————————————————–

Iniciei um projeto com Laravel 4 e gostaria de compartilhar como foi realizada a criação do mesmo validator para esta versão:

1- Primeiramente criei um arquivo CustomValidator.php e adicionei o código abaixo:

Dica: “Os nomes dos arquivos devem ser CamelCase como o nome das Classes no L4”.

<?php
class CustomValidator extends Illuminate\Validation\Validator {

    public function validateCpf($attribute, $value, $parameters)
    {
        $cpf = $value;
		/*
		Etapa 1: Cria um array com apenas os digitos numéricos, 
		isso permite receber o cpf em diferentes formatos 
		como "000.000.000-00", "00000000000", "000 000 000 00"
		*/
		$j=0;
		for($i=0; $i<(strlen($cpf)); $i++)
			{
				if(is_numeric($cpf[$i]))
					{
						$num[$j]=$cpf[$i];
						$j++;
					}
			}

		if($j==0)
			return false;

		/*
		Etapa 2: Conta os dígitos, 
		um cpf válido possui 11 dígitos numéricos.
		*/
		if(count($num)!=11)
			{
				return false;
			}
		/*
		Etapa 3: Combinações como 00000000000 e 22222222222 embora 
		não sejam cpfs reais resultariam em cpfs 
		válidos após o calculo dos dígitos verificares e 
		por isso precisam ser filtradas nesta parte.
		*/
		else
			{
				for($i=0; $i<10; $i++)
					{
						if ($num[0]==$i && $num[1]==$i && $num[2]==$i && $num[3]==$i && $num[4]==$i && $num[5]==$i && $num[6]==$i && $num[7]==$i && $num[8]==$i)
							{
								return false;
								break;
							}
					}
			}
		if(!isset($isCpfValid))
			{
				$j=10;
				for($i=0; $i<9; $i++)
					{
						$multiplica[$i]=$num[$i]*$j;
						$j--;
					}
				$soma = array_sum($multiplica);	
				$resto = $soma%11;			
				if($resto<2)
					{
						$dg=0;
					}
				else
					{
						$dg=11-$resto;
					}
				if($dg!=$num[9])
					{
						return false;
					}
			}
		/*
		Etapa 5: Calcula e compara o 
		segundo dígito verificador.
		*/
		if(!isset($isCpfValid))
			{
				$j=11;
				for($i=0; $i<10; $i++)
					{
						$multiplica[$i]=$num[$i]*$j;
						$j--;
					}
				$soma = array_sum($multiplica);
				$resto = $soma%11;
				if($resto<2)
					{
						$dg=0;
					}
				else
					{
						$dg=11-$resto;
					}
				if($dg!=$num[10])
					{
						return false;
					}
				else
					{
						return true;
					}
			}
		return true;
    }

    protected function replaceCPF($message, $attribute, $rule, $parameters)
	{
		if(count($parameters) > 0)
	    	return str_replace(':cpf', $parameters, $message);
	    else
	    	return $message;
	}

    public function validateCnpj($attribute, $value, $parameters)
    {
		$cnpj = $value;
			/*
			Etapa 1: Cria um array com apenas os digitos numéricos, 
		isso permite receber o cnpj em diferentes 
		formatos como "00.000.000/0000-00", "00000000000000", "00 000 000 0000 00" 
		etc...
		*/
		$j=0;
		for($i=0; $i<(strlen($cnpj)); $i++)
			{
				if(is_numeric($cnpj[$i]))
					{
						$num[$j]=$cnpj[$i];
						$j++;
					}
			}

		if($j==0)
			return false;

		//Etapa 2: Conta os dígitos, um Cnpj válido possui 14 dígitos numéricos.
		if(count($num)!=14)
			{
				return false;
			}
		/*
		Etapa 3: O número 00000000000 embora não seja um cnpj real resultaria 
		um cnpj válido após o calculo dos dígitos verificares 
		e por isso precisa ser filtradas nesta etapa.
		*/
		if ($num[0]==0 && $num[1]==0 && $num[2]==0 && $num[3]==0 && $num[4]==0 && $num[5]==0 && $num[6]==0 && $num[7]==0 && $num[8]==0 && $num[9]==0 && $num[10]==0 && $num[11]==0)
			{
				return false;
			}
		//Etapa 4: Calcula e compara o primeiro dígito verificador.
		else
			{
				$j=5;
				for($i=0; $i<4; $i++)
					{
						$multiplica[$i]=$num[$i]*$j;
						$j--;
					}
				$soma = array_sum($multiplica);
				$j=9;
				for($i=4; $i<12; $i++)
					{
						$multiplica[$i]=$num[$i]*$j;
						$j--;
					}
				$soma = array_sum($multiplica);	
				$resto = $soma%11;			
				if($resto<2)
					{
						$dg=0;
					}
				else
					{
						$dg=11-$resto;
					}
				if($dg!=$num[12])
					{
						return false;
					} 
			}
		//Etapa 5: Calcula e compara o segundo dígito verificador.
		if(!isset($isCnpjValid))
			{
				$j=6;
				for($i=0; $i<5; $i++)
					{
						$multiplica[$i]=$num[$i]*$j;
						$j--;
					}
				$soma = array_sum($multiplica);
				$j=9;
				for($i=5; $i<13; $i++)
					{
						$multiplica[$i]=$num[$i]*$j;
						$j--;
					}
				$soma = array_sum($multiplica);	
				$resto = $soma%11;			
				if($resto<2)
					{
						$dg=0;
					}
				else
					{
						$dg=11-$resto;
					}
				if($dg!=$num[13])
					{
						return false;
					}
				else
					{
						return true;
					}
			}
		return true;
	}

	protected function replaceCNPJ($message, $attribute, $rule, $parameters)
	{
		if(count($parameters) > 0)
	    	return str_replace(':cnpj', $parameters, $message);
	    else
	    	return $message;
	}

}

Como você deve ter percebido, também são adicionadas funcionalidades de replace{Validação}, para exibição da mensagem de erro, caso a mesma esteja adicionado ao arquivo na pasta Lang.

2 – Registrar o Validator:
Abra o arquivo app/start/global.php e adicione:

Validator::resolver(function($translator, $data, $rules, $messages)
{
    return new CustomValidator($translator, $data, $rules, $messages);
});

Para utiliza-lo:

$rules["cpf_cnpj"] = array("required","cpf");
$messages["cpf_cnpj.cpf"] = 'CPF inválido.';
//ou
$rules["cpf_cnpj"] = array("required","cnpj");
$messages["cpf_cnpj.cnpj"] = 'CPF inválido.';

Esse trecho registra o validator, sobre o Validator principal, mas estendendo o mesmo, pois na criação da classe adicionamos extends Illuminate\Validation\Validator.

Qualquer dúvida, estou a disposição.
https://plus.google.com/u/0/112101739663216187961/posts
https://www.facebook.com/flavio.h.ferreira
ou me envie um email no GMAIL

  • http://www.facebook.com/felipo.antonoff Felipo Antonoff Araújo

    Bem interessante, eu tenho implementado para CPF, mas foi feito de forma diferente, mas com a mesma finalidade, apenas gostaria de acrescentar, que para quem quiser uma mensagem personalizada, deve ir em :

    application/language/pt/validation.php e acrescentar no array de idiomas, algo como isso: “cpf” => “O :attribute não é válido.”,
    “cnpj” => “O :attribute não é válido.”,

    Eu mudei o pt, mas pode ser modificado em todos os idiomas. Em breve irei lançar meu E-commerce feito no Laravel 3, estou aprendendo muito com ele e com PHP e esse site está ficando bem interessante.

    • Flávio Ferreira

      É issso ai.

  • Rodrigo

    Muito bom essas validações. Uma dúvida da parte de validação de dados é: Como colocar uma mensagem de erro para cada tipo. Por exemplo na regra do cpf tem o required|cpf

    Neste caso como colocar uma mensagem de erro para os dois:
    – Você precisa informar um cpf. (no caso da regra required)
    – O cpf informado é inválido. (no caso da regra cpf)

    • http://www.facebook.com/people/Flavio-Henrique-Ferreira/1740708623 Flavio Henrique Ferreira

      Olá Rodrigo, obrigado pelo feedback, para customizar a mensagem basta criar um array contendo as mensagens para cada erro e passa-lo no momento em que realiza a validação.

      No L3.

      //Regras
      $rules = array(
      ‘cpf’ => ‘required|cpf’,
      ‘cnpj’ => ‘required|cnpj’,
      //Caso o required seja removido a
      //validação acontece somente quando o campo é preenchido.
      );

      //Mensagens
      $mensagens = array(
      ‘cpf_cpf’ => ‘O campo cpf é inválido’,
      ‘cpf_required’ => ‘Você precisa informar um cpf.’
      ‘cnpj_required’ => ‘Você precisa informar um cnpj.’
      ‘cnpj_cnpj’ => ‘O campo cnpj é inválido’
      );

      No L4

      //Mensagens
      $mensagens = array(
      ‘cpf.cpf’ => ‘O campo cpf é inválido’,
      ‘cpf.required’ => ‘Você precisa informar um cpf.’
      ‘cnpj.required’ => ‘Você precisa informar um cnpj.’
      ‘cnpj.cnpj’ => ‘O campo cnpj é inválido’
      );

      • Rodrigo

        Muito bom, gostei também de usar migration. Lembro de ver isso no rails e agora no Laravel. Muito bom.

        Alguém sabe quando o 4 será lançando?

  • Pingback: Criando um Validator Customizado CNPJ e CPF | devphp.in()

  • Bruno Moreira Santos

    Gostaria de uma ajuda…
    estou tentando validar um campo de telefone, como faço para valida-lo?
    segue como estou fazedo:

    $rules = array(
    ‘telefone’ => array(‘match:”/+[0-9]{1,3} ([0-9]{3}) [0-9]{5}-[0-9]{4}/”‘)
    );

    $validation = Validator::make(Input::all(), $rules);

    if ($validation->fails())
    {
    // Validation has failed.
    return Redirect::to(‘perfil2’)->withErrors($validation);
    }

  • Rangela

    As regras utilizo na indexcontroller?