Validating date and CPF in the GUMP

Asked

Viewed 213 times

0

I have two fields to validate: CPF and Date of Birth.

$validation = [
    'email'       => 'required|valid_email',
    'data_de_nascimento' => 'required|date'
    ];

I’m getting the date in format: 00/00/0000 and the CPF: 000.000.000-00.

How to validate this data using: GUMP::is_valid( $dados, $validation )

1 answer

1


In accordance with the documentation, there are two ways to create validations in GUMP. We can use the static method GUMP::add_validator or we can create our class and add the method validate_nossa_validacao, for example.


Creating validations with the static method

To create a validation with the static method, just use:

GUMP::add_validator("nome_da_validacao", function($field, $input, $param = null) {
    /* Verifica os dados */

    return true; //Em caso de sucesso ou "false" em caso de falha.
});

Complete code:

<?php

/**
 * Código responsável pela validação de CPF e data de nascimento para o GUMP (https://github.com/Wixel/GUMP)
 * @author: Valdeir Psr
 */

require_once "vendor/autoload.php";

/**
 * Criando validação do CPF
 *
 * @param  $field Nome do campo que será validado
 * @param  $value Valores dos campos
 */
GUMP::add_validator("validate_cpf", function($field, $value) {

    /* Adiciona mensagem de erro */
    GUMP::set_error_messages(['validate_cpf' => 'O campo {field} é inválido']);

    /**
     * Trecho retirado do repositório https://github.com/Respect/Validation/blob/a3c945aa51041b7a479ee9482c69a0f059fc228e/library/Rules/Cpf.php
     */
    $cpf = preg_replace('/\D/', '', $value[$field]);
    if (strlen($cpf) != 11 || preg_match("/^{$cpf[0]}{11}$/", $cpf)) {
        return false;
    }
    for ($s = 10, $n = 0, $i = 0; $s >= 2; $n += $cpf[$i++] * $s--);
    if ($cpf[9] != ((($n %= 11) < 2) ? 0 : 11 - $n)) {
        return false;
    }
    for ($s = 11, $n = 0, $i = 0; $s >= 2; $n += $cpf[$i++] * $s--);
    if ($cpf[10] != ((($n %= 11) < 2) ? 0 : 11 - $n)) {
        return false;
    }

    return true;
});

/**
 * Criando validação da data de nascimento
 *
 * @param $field Nome do campo que será validado
 * @param $value Valores dos campos
 * @param $range Limite de idade. Ex: "18 25", irá verificar
 *               se o usuário possui entre 18 e 25 anos
 */
GUMP::add_validator("validate_data_nascimento", function($field, $value, $range = null) {

    /**
     * Caso você não informe a idade limite,
     * verifica apenas a data
     */
    if ($range === null) {
        /* Adiciona mensagem de erro */
        GUMP::set_error_messages(['validate_data_nascimento' => 'O campo {field} é inválido']);

        /* Captura o dia, mês e ano, respectivamente */
        list($day,$month,$year) = explode("/", $value[$field]);

        return checkdate($month,$day,$year);
    }
    /* Caso contrário, verifica o limite */
    else {

        /* Separa os valores pelo espaço e captura-os */
        @list($start,$end) = explode(" ", $range);

        /* Captura a data atual */
        $dateCurrent = new DateTime();

        /* Converte a data do usuário para o objeto DateTime */
        $dateUser    = new DateTime( str_replace("/", "-", $value[$field]) );

        /* Captura a diferença entre as datas */
        $diff = $dateCurrent->diff($dateUser);

        /* Verifica se o usuário está na idade limite */
        return ($diff->y >= $start && ($diff->y <= $end || $end == null));
    }
});

/* Validando os campos */
var_dump(GUMP::is_valid([
        'cpf_valido'      => '98584138072',
        'cpf_invalido'    => '12345678900',
        'data_valida'     => '28/02/2018',
        'data_invalida'   => '29/02/2018',
        'idade_valida'    => '01/02/2000',
        'idade_invalida'  => '01/02/2010',
        'idade_valida2'   => '01/02/1950',
        'idade_invalida2' => '01/02/2019',
    ], [
        'cpf_valido'      => 'validate_cpf',
        'cpf_invalido'    => 'validate_cpf',
        'data_valida'     => 'validate_data_nascimento',
        'data_invalida'   => 'validate_data_nascimento',
        'idade_valida'    => 'validate_data_nascimento,18 24',
        'idade_invalida'  => 'validate_data_nascimento,18 24',
        'idade_valida2'   => 'validate_data_nascimento,18',
        'idade_invalida2' => 'validate_data_nascimento,18 99',
    ])
);

Code taken from the website: https://gist.github.com/valdeir2000/507cffbfbdc9ab9920701a1bbba43441#file-gump_validator_static-php


Creating validator with classes

Here we need to create a class and then extend the class GUMP, for example:

class ValidatorPsr extends GUMP {

    /**
     * Criando validação do CPF
     *
     * @param $field Campo a ser validado
     * @param $value Valores dos campos
     * @param $param Parâmetro utilizado após a vírgula
     */
    public function validate_nome_da_validacao($field, $value, $param = null)
    {
        /* Utilizamos nosso código para validação */

        /* Em caso de erro, DEVEMOS retornar */
        return array(
            'field' => $field,
            'value' => $value,
            'rule' => __FUNCTION__,
            'param' => null,
        );

    }

It is important that your validator name starts with validate_

In this anonymous function, we receive three parameters:

  1. $field: The name of the field that will be validated
  2. $input: The values to be validated
  3. $param: The parameter that can be passed after the comma.

In the example below, I create the validation functions and comment the necessary lines:

Follow the complete and commented code:

<?php

/**
 * Código responsável pela validação de CPF e data de nascimento para o GUMP (https://github.com/Wixel/GUMP)
 * @author: Valdeir Psr
 */

require_once "vendor/autoload.php";

class ValidatorPsr extends GUMP {

    /**
     * Criando validação do CPF
     *
     * @param $field Campo a ser validado
     * @param $value Valores dos campos
     */
    public function validate_cpf($field, $value)
    {
        /* Adiciona mensagem de erro */
        GUMP::set_error_messages(['validate_cpf' => 'O campo {field} é inválido']);

        /**
         * Trecho retirado do repositório https://github.com/Respect/Validation/blob/a3c945aa51041b7a479ee9482c69a0f059fc228e/library/Rules/Cpf.php
         */
        $cpf = preg_replace('/\D/', '', $value[$field]);
        if (strlen($cpf) != 11 || preg_match("/^{$cpf[0]}{11}$/", $cpf)) {
            return array(
                'field' => $field,
                'value' => $value,
                'rule' => __FUNCTION__,
                'param' => null,
            );
        }
        for ($s = 10, $n = 0, $i = 0; $s >= 2; $n += $cpf[$i++] * $s--);
        if ($cpf[9] != ((($n %= 11) < 2) ? 0 : 11 - $n)) {
            return array(
                'field' => $field,
                'value' => $value,
                'rule' => __FUNCTION__,
                'param' => null,
            );
        }
        for ($s = 11, $n = 0, $i = 0; $s >= 2; $n += $cpf[$i++] * $s--);
        if ($cpf[10] != ((($n %= 11) < 2) ? 0 : 11 - $n)) {
            return array(
                'field' => $field,
                'value' => $value,
                'rule' => __FUNCTION__,
                'param' => null,
            );
        }

        return true;
    }

    /**
     * Criando validação da data de nascimento
     *
     * @param $field Campo a ser validado
     * @param $value Valores dos campos
     * @param $range Limite de idade. Ex: "18 25", irá verificar
     *               se o usuário possui entre 18 e 25 anos
     */
    public function validate_data_nascimento($field, $value, $range = null)
    {
        /**
         * Caso você não informe a idade limite,
         * verifica apenas a data
         */
        if ($range === null) {
            /* Adiciona mensagem de erro */
            GUMP::set_error_messages(['validate_data_nascimento' => 'O campo {field} é inválido']);

            /* Captura o dia, mês e ano, respectivamente */
            list($day,$month,$year) = explode("/", $value[$field]);

            if (!checkdate($month,$day,$year)) {
                return array(
                    'field' => $field,
                    'value' => $value,
                    'rule' => __FUNCTION__,
                    'param' => null,
                );
            }
        }
        /* Caso contrário, verifica o limite */
        else {

            /* Separa os valores pelo espaço e captura-os */
            @list($start,$end) = explode(" ", $range);

            /* Captura a data atual */
            $dateCurrent = new DateTime();

            /* Converte a data do usuário para o objeto DateTime */
            $dateUser    = new DateTime( str_replace("/", "-", $value[$field]) );

            /* Captura a diferença entre as datas */
            $diff = $dateCurrent->diff($dateUser);

            /* Verifica se o usuário está na idade limite */
            if (!($diff->y >= $start && ($diff->y <= $end || $end == null))) {
                return array(
                    'field' => $field,
                    'value' => $value,
                    'rule' => __FUNCTION__,
                    'param' => null,
                );
            }
        }
    }

}

/* Validando os campos */
$validator = new ValidatorPsr();

var_dump( $validator->validate([
        'cpf_valido'      => '98584138072',
        'cpf_invalido'    => '12345678900',
        'data_valida'     => '28/02/2018',
        'data_invalida'   => '29/02/2018',
        'idade_valida'    => '01/02/2000',
        'idade_invalida'  => '01/02/2010',
        'idade_valida2'   => '01/02/1950',
        'idade_invalida2' => '01/02/2019',
    ], [
        'cpf_valido'      => 'cpf',
        'cpf_invalido'    => 'cpf',
        'data_valida'     => 'data_nascimento',
        'data_invalida'   => 'data_nascimento',
        'idade_valida'    => 'data_nascimento,18 24',
        'idade_invalida'  => 'data_nascimento,18 24',
        'idade_valida2'   => 'data_nascimento,18',
        'idade_invalida2' => 'data_nascimento,18 99',
    ]) );

Code taken from the website: https://gist.github.com/valdeir2000/507cffbfbdc9ab9920701a1bbba43441

Browser other questions tagged

You are not signed in. Login or sign up in order to post.