Novembro 25th 2008 03:48 am

Validação de CPF utilizando Zend_Validate

Há algum tempo eu estava devendo algum post técnico, então resolvi dar uma brincada com o Zend_Validate, posto aqui um validator que fiz para CPF (Cadastro de Pessoas Físicas). A quem possa servir segue o código:

PHP:
  1. <?php
  2.  
  3. require_once 'Zend/Validate/Abstract.php';
  4.  
  5. /**
  6.  * Validador para fazer a validação de CPF (Cadastro de Pessoas Físicas)
  7.  *
  8.  * @author Diego Tremper <diegotremper@gmail.com>
  9.  */
  10. class Validate_Cpf extends Zend_Validate_Abstract
  11. {
  12.     const INVALID_DIGITS = 'i_number';
  13.    
  14.     const INVALID_FORMAT = 'i_format';
  15.    
  16.     protected $_messageTemplates = array (
  17.                     self::INVALID_DIGITS => "O cpf '%value%' não é válido",
  18.                     self::INVALID_FORMAT => "O formato do cpf '%value%' não é válido"
  19.               );
  20.               
  21.     private $_pattern = '/(\d{3})\.(\d{3})\.(\d{3})-(\d{2})/i';
  22.    
  23.     private $_skipFormat = false;
  24.    
  25.     /**
  26.      * Inicializa a instância do validador
  27.      *
  28.      * @param bool $skipFormat fazer validação no formato?
  29.      */
  30.     public function __construct($skipFormat = false) {
  31.         $this->_skipFormat = $skipFormat;
  32.     }
  33.    
  34.     /**
  35.      * verifica se o cpf é válido
  36.      *
  37.      * @param string $value cpf a ser validado
  38.      * @return bool
  39.      */
  40.     public function isValid($value)
  41.     {
  42.         $this->_setValue ( $value );
  43.        
  44.         if (!$this->_skipFormat && preg_match($this->_pattern, $value) == false) {
  45.             $this->_error(self::INVALID_FORMAT);
  46.             return false;
  47.         }
  48.        
  49.         $digits = preg_replace('/[^\d]+/i', '', $value);
  50.         $firstSum = 0;
  51.         $secondSum = 0;
  52.        
  53.         for ($i=0; $i<9; $i++) {
  54.             $firstSum += $digits{$i} * (10 - $i);
  55.             $secondSum += $digits{$i} * (11 - $i);
  56.         }
  57.        
  58.         $firstDigit = 11 - fmod($firstSum, 11);
  59.        
  60.         if ($firstDigit>= 10) {
  61.             $firstDigit = 0;
  62.         }
  63.        
  64.         $secondSum = $secondSum + ($firstDigit*2);
  65.         $secondDigit = 11 - fmod($secondSum, 11);
  66.        
  67.         if ($secondDigit>= 10) {
  68.             $secondDigit = 0;
  69.         }
  70.        
  71.         if (substr($digits, -2) != ($firstDigit . $secondDigit)) {
  72.             $this->_error(self::INVALID_DIGITS);
  73.             return false;
  74.         }
  75.        
  76.         return true;
  77.     }
  78. }

Para utilizar:

PHP:
  1. <?php
  2.  
  3. require_once 'Validate/Cpf.php';
  4.  
  5. /**
  6.  * testar cpf com validação no formato e digito verificador
  7.  */
  8. $v = new Validate_Cpf ( );
  9. var_dump ( $v->isValid ( "123.456.789-09" ) ); //cpf válido
  10. print_r ( $v->getMessages () );
  11.  
  12. var_dump ( $v->isValid ( "123.456.78909" ) ); //cpf com formato inválido
  13. print_r ( $v->getMessages () );
  14.  
  15. var_dump ( $v->isValid ( "123.456.789-08" ) ); //cpf com digito verificador inválido
  16. print_r ( $v->getMessages () );
  17.  
  18. /**
  19.  * testar cpf com validação de digito verificador e SEM validação de formato
  20.  */
  21. $v = new Validate_Cpf ( true );
  22. var_dump ( $v->isValid ( "123.456.789-09" ) ); //cpf válido
  23. var_dump ( $v->isValid ( "12345678909" ) ); //cpf válido
  24. print_r ( $v->getMessages () );
  25.  
  26. $v = new Validate_Cpf ( true );
  27. var_dump ( $v->isValid ( "12345678900" ) ); //cpf com digito verificador inválido
  28. print_r ( $v->getMessages () );

Para quem quiser os arquivos segue o link: validate.zip. (Não há nada além do código acima!)

Referência: http://framework.zend.com/manual/en/zend.validate.html

[]s

Compartilhe:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Mixx
  • LinkedIn
  • Live
  • Rec6
  • Technorati
  • TwitThis
1 Estrela2 Estrela3 Estrela4 Estrela5 Estrela (1 votos, média: 5 de 5)
Loading ... Loading ...

5 Comments »

5 Responses to “Validação de CPF utilizando Zend_Validate”

  1. Nivaldo Arruda on 25 Nov 2008 at 10:52 #

    Eu ia providenciar um desses essa semana mesmo. Mas como assino seu rss, vai me poupar algum trabalho. Vou baixar e testar depois.

    ^^

    Abraços

  2. Pablo Luz on 07 Ago 2009 at 13:00 #

    Valeu, Diego! Código simples e funcional. Virei fã do teu blog.

  3. muan on 04 Set 2009 at 23:25 #

    Boa! belo trabalho! =)

  4. Fernanda Leme on 22 Out 2009 at 19:34 #

    Muito bom o post…
    Achei mais coisa legal nesse site:

    http://www.gerardocumentos.com.br/?pg=funcao-javascript-para-gerar-cpf

    http://www.gerardocumentos.com.br/?pg=entenda-a-formula-do-cpf

    Tem de outros documentos tbm:

    http://www.gerardocumentos.com.br/?pg=gerador-cnpj-valido

    http://www.gerardocumentos.com.br/?pg=gerador-rg-valido

  5. Waldeyr Mendes on 10 Nov 2009 at 20:24 #

    Olá! Amigo, como ficaria o uso da classe se quiser utilizá-la como validator dentro de uma classe Zend_form?

    Exemplo:

    class SIGA_Form_AtualizarAluno extends Zend_Form {

    public function init(){

    $translate = Zend_Registry::get(’translate’);
    $this->setTranslator($translate);

    $this->setAction($this->baseUrl . ‘atualizar’);

    $this->setMethod(’post’);

    $aluCPF = $this->createElement(’text’, ‘aluCPF’, array(’label’=>’CPF:’, ’size’=>’14′));
    $aluCPF->setRequired(true)
    ->addValidator( ? );

    $this->addElement($aluCPF);
    }
    }

Trackback URI | Comments RSS

Leave a Reply

« Latinoware 2008 - Slides das palestras | Rolling File utilizando Zend_Log »