Codeigniter 4 - Criando uma classe de validação para CNPJ e CPF

Veja como criar uma classe para validar  #CPF e #CNPJ em seus formula?ios com regras backend.

Se você já está em um projeto #codeigniter siga os passoas abaixo.

 

 

1 - Criando classe de validação. Em app/Validation

<?php

namespace App\Validation;

class CPFRules
{
    public function validaCPF(string $str, string &$error = null): bool
    {
        // Remove caracteres não numéricos
        $cpf = preg_replace('/[^0-9]/', '', $str);
        
        // Verifica se tem 11 dígitos
        if (strlen($cpf) != 11) {
            return false;
        }
        
        // Verifica se todos os dígitos são iguais
        if (preg_match('/^(\d)\1{10}$/', $cpf)) {
            return false;
        }
        
        // Calcula o primeiro dígito verificador
        $soma = 0;
        for ($i = 0; $i < 9; $i++) {
            $soma += $cpf[$i] * (10 - $i);
        }
        $resto = $soma % 11;
        $dv1 = ($resto < 2) ? 0 : 11 - $resto;
        
        // Verifica o primeiro dígito verificador
        if ($cpf[9] != $dv1) {
            return false;
        }
        
        // Calcula o segundo dígito verificador
        $soma = 0;
        for ($i = 0; $i < 10; $i++) {
            $soma += $cpf[$i] * (11 - $i);
        }
        $resto = $soma % 11;
        $dv2 = ($resto < 2) ? 0 : 11 - $resto;
        
        // Verifica o segundo dígito verificador
        if ($cpf[10] != $dv2) {
            return false;
        }
        
        return true;
    }
    
    public function validaCPFCNPJ(string $str, string &$error = null): bool
    {
        // Remove caracteres não numéricos
        $documento = preg_replace('/[^0-9]/', '', $str);
        
        // Verifica se é CPF (11 dígitos) ou CNPJ (14 dígitos)
        if (strlen($documento) == 11) {
            return $this->validaCPF($documento);
        } elseif (strlen($documento) == 14) {
            return $this->validaCNPJ($documento);
        }
        
        return false;
    }
    
    public function validaCNPJ(string $str, string &$error = null): bool
    {
        // Remove caracteres não numéricos
        $cnpj = preg_replace('/[^0-9]/', '', $str);
        
        // Verifica se tem 14 dígitos
        if (strlen($cnpj) != 14) {
            return false;
        }
        
        // Verifica se todos os dígitos são iguais
        if (preg_match('/^(\d)\1{13}$/', $cnpj)) {
            return false;
        }
        
        // Calcula o primeiro dígito verificador
        $soma = 0;
        $multiplicador = 5;
        for ($i = 0; $i < 12; $i++) {
            $soma += $cnpj[$i] * $multiplicador;
            $multiplicador = ($multiplicador == 2) ? 9 : $multiplicador - 1;
        }
        $resto = $soma % 11;
        $dv1 = ($resto < 2) ? 0 : 11 - $resto;
        
        // Verifica o primeiro dígito verificador
        if ($cnpj[12] != $dv1) {
            return false;
        }
        
        // Calcula o segundo dígito verificador
        $soma = 0;
        $multiplicador = 6;
        for ($i = 0; $i < 13; $i++) {
            $soma += $cnpj[$i] * $multiplicador;
            $multiplicador = ($multiplicador == 2) ? 9 : $multiplicador - 1;
        }
        $resto = $soma % 11;
        $dv2 = ($resto < 2) ? 0 : 11 - $resto;
        
        // Verifica o segundo dígito verificador
        if ($cnpj[13] != $dv2) {
            return false;
        }
        
        return true;
    }
}

2 - Importando a classe para app/Config/Validation.php

<?php

namespace Config;

use CodeIgniter\Validation\CreditCardRules;
use CodeIgniter\Validation\FileRules;
use CodeIgniter\Validation\FormatRules;
use CodeIgniter\Validation\Rules;
use App\Validation\CPFRules;

class Validation
{
    //--------------------------------------------------------------------
    // Setup
    //--------------------------------------------------------------------

    /**
     * Stores the classes that contain the
     * rules that are available.
     *
     * @var string[]
     */
    public $ruleSets = [
        Rules::class,
        FormatRules::class,
        FileRules::class,
        CreditCardRules::class,
        CPFRules::class, // Adicione esta linha
    ];

    /**
     * Specifies the views that are used to display the
     * errors.
     *
     * @var array<string, string>
     */
    public $templates = [
        'list'   => 'CodeIgniter\Validation\Views\list',
        'single' => 'CodeIgniter\Validation\Views\single',
    ];

    //--------------------------------------------------------------------
    // Rules
    //--------------------------------------------------------------------
}

3 - Utilizando a classe de validação nas #regras de validação.

public function store()
{
// Regras de validação, incluindo CPF/CNPJ
        $rules = [
            'cpf_cnpj' => [
                'label' => 'CPF/CNPJ',
                'rules' => 'required|validaCPFCNPJ',
                'errors' => [
                    'required' => 'O campo CPF/CNPJ é obrigatório.',
                    'validaCPFCNPJ' => 'O CPF/CNPJ informado não é válido.'
                ]
            ],
            // Outras regras de validação para os demais campos...
        ];
        
        // Executa a validação
        if (!$this->validate($rules)) {
            // Se a validação falhar, retorna ao formulário com erros
            return redirect()->back()
                ->withInput()
                ->with('errors', $this->validator->getErrors());
        }
        
        // Se a validação passar, salva os dados
}

Ou você pode utilizar um apelido e trazer a regra de validação da classe de validação do #codeigniter -> app/Config/Validation.php

public $cadastro_de_cliente = [

            'cpf_cnpj' => [
                'label' => 'CPF/CNPJ',
                'rules' => 'required|validaCPFCNPJ',
                'errors' => [
                    'required' => 'O campo CPF/CNPJ é obrigatório.',
                    'validaCPFCNPJ' => 'O CPF/CNPJ informado não é válido.'
                ]
            ],
];

// No controller

if (!$this->validate('cadastro_de_cliente')) {
    ...
}