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')) {
...
}
Compartilhe este artigo: