Giter Club home page Giter Club logo

validator-docs's Issues

Não consigo usar novas regras de validação do Laravel 8

Estou tentando usar a regra prohibited_if (https://laravel.com/docs/8.x/validation#rule-prohibited-if) e também usar as validações de cpf e cnpj do validator-docs.
Porem recebo um erro vindo do validator-docs dizendo que não existe a regra prohibited_if.
O laravel não implementou a regra ou o validator-docs é que não conhece as novas regras da versão 8.x ?
Tem como corrigir isto para continuar usando o validator-docs e também tirar proveito das regras novas ?

[DISCUSSÃO] Sugestão de melhoria

Sugiro a refatoração do aquivo ValidatorProvider para ond ele extenda as validações já existentes no laravel sem substituir a resolução da validação (código citado), fazendo isso tambem seria nescessario refetorar as rules, abaixo segue exemplo.

$this->app['validator']
->resolver(
function ($translator, $data, $rules, $messages, $attributes) use ($me, $validatorFormats) {
$messages += $me->getMessages();
return new Validator($translator, $validatorFormats, $data, $rules, $messages, $attributes);
}
);

Exemplo de provider

use App\Rules\Base64ImageRule;
use App\Rules\CheckBilletDueDateRule;
use App\Rules\CheckBilletPaymentRule;
use App\Rules\CheckCreditCardInstallmentsRule;
use App\Rules\CheckInstallmentsRule;
use App\Rules\EnumRule;
use Illuminate\Support\ServiceProvider;
use Validator;

class ValidationServiceProvider extends ServiceProvider
{
    protected array $rules = [
        'enum' => EnumRule::class,
        'base64_image' => Base64ImageRule::class,
        'check_installments' => CheckInstallmentsRule::class,
        'billet_value_paid' => CheckBilletPaymentRule::class,
        'billet_due_date' => CheckBilletDueDateRule::class,
        'check_installments_count' => CheckCreditCardInstallmentsRule::class,
    ];

    /**
     * @return void
     */
    public function boot(): void
    {
        $this->registerValidationRules();
    }

    /**
     * @return void
     */
    private function registerValidationRules(): void
    {
        foreach ($this->rules as $alias => $class) {
            if (is_string($alias)) {
                Validator::extend($alias, "$class@passes");
            }
        }
    }
}

Este exemplo tirei de um projeto que fiz

Prós

  • Maior compatibilidade com as versoes do Laravel (pelo menos do meu ponto de vista)
  • Suporte a customização dos attibutes
  • Suporte a customização das mensagens por arquivos de tradução
  • Resolução da issue #133

Contras

  • Trabalho para refatorar (posso ajudar)
  • Possivel perda de retrocompatibilidade (brakingchange)
  • Possiveis erros/problemas que eu ainda não encontrei

Sanitização causa validação errônea quando a input possue letras

Veja um caso de duas inputs que são aplicadas a regra de validação para CNH:

$cnh_valido = '43872153406';
$cnh_invalido = 'ZZZ43872153406'

Ambos passam na validação, pois a chamada do método sanitize:

public function sanitize($value): string
    {
        return empty($value) ? "" : preg_replace('/[^\d]/', '', $value);
    }

$value = $this->sanitize($value);

O sanitize altera o valor antes da valiação, porém, como ele não altera o próprio request (e nem faz sentido), a aplicação identifica como válido um valor que na verdade é inválido.
Testei com CNH, mas com certeza deve ocorrer em todas as Rules que também utilizam o sanitize.

A correção é simples, a validação deve ser feita em cima da input bruta e não deve haver nenhuma transformação antes da validação.

Nomes dos atributos

Olá,

Os nomes dos atributos não estão sendo passados.

No arquivo ValidatorProvider.php está assim

public function boot()
    {

        $me = $this;

        $this->app['validator']->resolver(function ($translator, $data, $rules, $messages) use ($me) {
            $messages += $me->getMessages();
            return new Validator($translator, $data, $rules, $messages);
        });
    }

Mas deveria estar assim

public function boot()
    {

        $me = $this;

        $this->app['validator']->resolver(function ($translator, $data, $rules, $messages, $attributes) use ($me) {
            $messages += $me->getMessages();

            return new Validator($translator, $data, $rules, $messages, $attributes);
        });
    }

Validação de CNH errada

O validador implementado não cobre todos os casos corretamente.
Exemplo real que chegou pra mim hoje: 04463004100.

O validador do 4devs usado como referência do projeto indica falso.
O validador em:
https://www.treinaweb.com.br/ferramentas-para-desenvolvedores/validar/cnh
Aponta corretamento como verdadeiro.

Vou pegar o algoritmo correto com o detran. E depois faço um pull request.

Mas já fica o alerta, e é a 2ª vez que encontro erro nas implementação desse 4devs. Não são muito confiáveis não.

E acredito que deva ter mais exemplos nos casos de teste, com apenas 1 caso é muito fácil passar um algoritmo problemático.

Qdo o campo não é requerido e vem em branco gera erro

Olá, na minha aplicação exijo o cpf/cnpj, apenas se um outro determinado campo tiver um valor específico, e nesse caso uso
dessa forma:

'cpf_cnpj' => 'required_if:tipo_cobranca,1,2|cpf_cnpj'

O problema é que ele está validando com o campo em branco.

No caso eu acredito que a validação tenha de ocorrer apenas se tiver informação

Para verificar a formação também dá problemas, mas no caso de adicionar formato_cpf_cnpj, gera exceção na aplicação

Laravel 5.6

Bom dia!

Parabéns pela iniciativa! Ao utilizar o validador para o cpf, mesmo que eu insira um cpf inválido ele permite prosseguir.

Embora eu tenha colocado a validação do cpf no array de validação
'cpf' => 'required|cpf'

Rodei o composer install tbm e acrescentei geekcom\ValidatorDocs\ValidatorProvider::class, no app.php

Mesmo assim o cpf inválido não é barrado.. Será que estou esquecendo alguma etapa ou não é compativel com laravel 5.6?

Problemas na validação da biblioteca de RENAVAM

Olá pessoal, estou usando a biblioteca de vocês para realizar as validações de RENAVAM. Estou utilizando o gerador do 4Devs para realizar os testes, mas o retorno que tenho da biblioteca é que o número do RENAVAM é inválido. Tentei colocar meu RENAVAM pessoal, e mesmo assim dá inválido. Coloquei um outro RENAVAM real de outro carro e passou. Poderiam verificar se há alguma inconsistência? Pois vocês mesmos indicam o 4Devs para testes e nenhum dos números gerados passam como válidos. No aguardo. Se precisarem de apoio, me avisem que estou disponível para tirar dúvidas. Obrigado.

[Ajuda] - Testar a lib no Laravel 9.

Olá pessoal, precisamos ajuda para testar a nossa lib em uma instalação nova do Laravel 9.
Acredito que já estamos atualizados, pois aparentemente não tivemos mudanças no framework, assim não teríamos grandes problemas. Entretanto s é necessário realizar testes funcionais para garantir esse ponto.

Esperamos que apareçam pessoas voluntárias afim de ajudar-nos nesta tarefa, muito obrigado pela contribuição de todos, o open source vive graças a vocês. S2

PHP puro

Show essa lib!
É possível usar em PHP puro?
Existe algum equivalente para PHP puro?

Obrigatoriedade

Amigo, ao meu ver, a validação dos campos não deveria obrigar eles a estarem preenchidos.

Por exemplo, meu formulário tem um campo CNPJ que não é obrigatório, ao usar a validação cnpj, mesmo que o campo vá vazio, ele da erro no campo dizendo que não é válido.

Para obrigar um campo ser obrigatório, o laravel já tem o required

Documentação incompleta/insuficiente.

Estou tentando fazer a validação mas a mesma me retorna os inputs.
A documentação não deixa claro o que devo fazer caso a validação não passe.

`$rules = [
'name' => 'required',
'cpf' => 'required|cpf', // ADICIONAR UNIQUE
'email' => 'unique:users|required',
'password' => 'required|confirmed|min:6',
];

$this->validate($request, $rules);
// O QUE EU FAÇO COM ISSO? Armazeno numa variável?
// Como retornar o erro em JSON?`

Aceitar valor NULL quando a validação não possuir "required"

Estou utilizando a validação "cpf_cnpj", porém o meu campo é de preenchimento opcional. Então se tento salvar sem preencher o CPF ou CNPJ a validação é feita mesmo assim.

Tem como obrigar a validação somente quando for "required|cpf_cnpj" e quando estiver apenas "cpf_cnpj" não validar se o campo não estiver preenchido?

RG - Registro Geral

Verifiquei que não existe validador para RG no projeto.
Realizando uma pequena busca na internet constatei que cada Estado tem autonomia para emitir RG com seu padrão.

Seria o caso de criar uma validação para cada Estado ou considerar a menos restritiva?

Validação unique

Como utilizo a validação de cpf unique key?
Tentei assim e não funcionou.
'cpf' => 'required|unique:users,cpf|cpf',

Validação de Passaporte brasileiro

Poderíamos adicionar validação de passaporte na lib, o que acham?

fiz uma prova de conceito, que deve precisar de alguns ajustes da comunidade, mas pelo menos ilustrei minha ideia

Validação RG

Olhei a documentação e não consegui identificar se já possui uma validação de RG ou isso ainda não foi implementado ?

Package autodiscovery

Olá, estou usando este package em meus projetos e gostaria de saber se o mesmo ainda está sendo mantido.

Em caso afirmativo, gostaria de saber se posso enviar uma PR para adição do package autodiscovery.

Desde já, agradeço!

Substituição de mensagens de erro

A lib está retornando que o CPF 29075 é invalido, quando o CPF na verdade está duplicado no banco de dados

'cpf' => ['required', 'cpf', Rule::unique('users')->whereNull('deleted_at')],

php: ^8.1 -> 8.1.12
laravel/framework: ^9.19 -> 9.31.0
geekcom/validator-docs: ^3.7 -> 3.7.1

   $validationRules = [
            'name' => 'required',
            'cpf' => ['required', 'cpf', Rule::unique('users')->whereNull('deleted_at')],
            'cell_phone' => 'required|regex:/\([0-9]{2}\) 9[0-9]{2}\.[0-9]{3}\.[0-9]{3}/',
            'birth_date' => 'required|date_format:d/m/Y',
            'email' => [
                'required',
                'email:rfc,dns,spoof,filter',
                function ($attribute, $value, $fail) {
                    $exists = User::where('email', Str::lower($value))
                        ->whereNull('deleted_at')
                        ->exists();
                    if ($exists) {
                        $fail("O {$attribute} informado, já está em uso!");
                    }
                },
            ],
            'password' => $this->storePasswordRules(),
        ];
        $validator = Validator::make(
            $request->all(),
            $validationRules,
            ['cell_phone.regex' => 'O campo celular não é valido!']
        );
        $validator->setAttributeNames(
            [
                'cpf' => 'Cadastro de Pessoa Física',
                'name' => 'nome',
                'email' => 'e-mail',
                'password' => 'senha',
                'cell_phone' => 'celular',
                'birth_date' => 'data de nascimento',
            ]
        );

        if ($validator->fails()) {
            return $this->response(
                $validator->errors()->toArray(),
                'Erro',
                HttpStatusCodeEnum::UnprocessableContent
            );
        }

$this->app['validator']
->resolver(
function ($translator, $data, $rules, $messages, $attributes) use ($me, $validatorFormats) {
$messages += $me->getMessages();
return new Validator($translator, $validatorFormats, $data, $rules, $messages, $attributes);
}
);

Erro aconte pois ao chamar o método make do validator ele chama o metodo resolve (referencia acima) as mesagens são substituidadas o por que que as mensagens são substituidas eu não entendi, já que se comentar o código citado resolve o problema.

PS. Vou abrir outra issue para sugerir algumas mudanças

Não está funcionando no Laravel 5.7

Bom dia,

O validador não está funcionando no Laravel 5.7, ocorre o seguinte erro: Method Illuminate\Validation\Validator::validateCpf does not exist.

Method geekcom\Validator Docs\Validator::validate Required, does not exist

Fala galera.

Estou utilizando Laravel 5.8 e tentando fazer o store() mas tá dando esse erro quando clico em cadastrar.

Method geekcom\Validator Docs\Validator::validate Required, does not exist

ImediataController.php

public function store(ImediataStoreRequest $request)
    {
        $dados = $request->validated();        

        $funcionario_id = Auth::id();

        $dados['funcionario_id']    = $funcionario_id;

        Imediata::create($dados);

        return redirect()->route('acao-imediata.index')->with('success', "Ação Imediata cadastrada com sucesso!");
    }
ImediataStoreRequest.php

public function rules()
    {
        return [
            'nome'              => 'required,' . $this->imediata,
            'data'              => 'required,' . $this->imediata,
            'descricao'         => 'required,' . $this->imediata,
            'equipamento_id'    => '',
            'funcionario_id'    => 'required,' . $this->imediata,
            'status'            => '',
        ];
    }

Alguma solução ?

Definir a versão mínima do PHP [Sugestão]

O requisito da lib é illuminate/support: 5.*. Sendo o mais baixo 5.0 que requer PHP 5.4.0 [1]. Já o requisito dev é PHPUnit 7.5 que requer PHP 7.1. Sugiro que escolha uma versão para requisito do PHP e coloque no package.json para ajudar o usuário entender o ambiente necessário.

Outra coisa que pode ajudar também é o CI executar os testes em várias versões do PHP.

[1] https://github.com/laravel/framework/blob/5.0/composer.json
[2] https://github.com/sebastianbergmann/phpunit/blob/7.5/composer.json

Melhorar validação de certidão de nascimento

De acordo com este site, este é o algoritmo para se calcular o dígito verificador de uma certidão de nascimento:

(exemplo: 104539015520131000120210000123)

[...]

O Número de Matrícula tem a configuração aaaaaa.bb.cc.dddd.e.fffff.ggg.hhhhhhh-ii, onde:

[...]

ii indica o Dígito Verificador DV, cujo cálculo obedece ao seguinte esquema, dentro do critério de DV MÓDULO 11 já conhecido:

1  0  4  5  3  9  0  1  5  5  2  0  1  3  1  0  0  0  1  2  0  2  1  0  0  0  0  1  2  3 = 2               
x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x 
2  3  4  5  6  7  8  9 10  0  1  2  3  4  5  6  7  8  9 10  0  1  2  3  4  5  6  7  8  9
----------------------------------------------------------------------------------------                   
2+ 0+16+25+18+63+ 0+ 9+50+ 0+ 2+ 0+ 3+12+ 5+ 0+ 0+ 0+ 9+20+ 0+ 2+ 2+ 0+ 0+ 0+ 0+ 7+16+27 = 288

288÷11=26, com resto 2 (este é o 1º dígito do DV) - Nota: se o resto for "10", o DV será "1"

1  0  4  5  3  9  0  1  5  5  2  0  1  3  1  0  0  0  1  2  0  2  1  0  0  0  0  1  2  3  2 = 1
x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x
1  2  3  4  5  6  7  8  9 10  0  1  2  3  4  5  6  7  8  9 10  0  1  2  3  4  5  6  7  8  9
-------------------------------------------------------------------------------------------
1+ 0+12+20+15+54+ 0+ 8+45+50+ 0+ 0+ 2+ 9+ 4+ 0+ 0+ 0+ 8+18+ 0+ 0+ 1+ 0+ 0+ 0+ 0+ 6+14+24+18 = 309

309÷11=28, com resto 1 (este é o 2º dígito do DV) - Nota: se o resto for "10", o DV será "1"

Portanto, o Número de Matrícula+DV = 104539.01.55.2013.1.00012.021.0000123-21.

Em pseudocódigo, ficaria mais ou menos assim:

soma0 = 0
soma1 = 0

i = 0
para cada digito nos 30 primeiros digitos da certidao
    soma0 += digito * (i + 2)
    soma1 += digito * (i + 1)
    i += 1

d0 = soma0 % 11
se d0 == 10 
    d0 = 1

d1 = (soma1 + 9*d0) % 11
se d1 == 10 
    d1 = 1

dv = d0*10 + d1

Para tornar a validação mais precisa, bastaria comparar o Dígito Verificador calculado com os últimos dois dígitos da certidão:

dvEsperado = d0*10 + d1
dvAtual = ultimos 2 digitos da certidao como inteiro
valido = dvAtual == dvEsperado

Não encontrei nenhuma descrição desse método em documentos oficiais. No entanto, por prestar serviços a um órgão público, tenho acesso a uma base considerável de certidões de nascimento e o algoritmo conseguiu validar todos. No entanto, se alguém quiser contribuir com a discussão, pode ficar à vontade!

Isso iria melhorar bastante a validação atual, que pelo que entendi é feita somente por uma expressão regular.

PHP 8

Tem alguma limitação para atualizar o composer.json para também suportar php 8?

Possibilidade de CPF/CNPJ com zeros

Olá, seria possível implementar uma opção onde o CPF/CNPJ (são obrigatórios no BD), pudessem ser passados com 000.000.000-00 por exemplo? Sei que não é o correto, principalmente pq no BD é obrigatório, mas no dia a dia as vezes se faz necessário.

No restante, top demais, parabens.

Como usar a validação do cpf e cnpj com required_if

Preciso validar dependendo do que for enviado pelo usuário
meu código esta assim

'cli_cpf' => 'required_if:cli_tipo,==,PF|cpf',
'cli_cnpj' => 'required_if:cli_tipo,==,PJ|cnpj',

porém ele valida os dois e não obedece o required_if

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.