Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Usando Form Requests, como criar mensagens genéricas para regras mais complexas como: "max:500"?

Existe alguma maneira de tornar regras como "min:5" ou "max:500" genéricas na função messages do Form Requests, assim como é feito com um simples 'required'? Caso sim, como?

No exercício do curso, na classe ProdutosResquest, função messages, eu tentei criar mensagens customizadas que fossem genéricas a todos os casos em que o valor máximo fosse 500, ou que o valor mínimo fosse 5, a exemplo do que foi feito com a regra required:

    public function rules()
    {
        return [
            'nome' => 'required|min:5',
            'descricao' => 'required|max:500',
            'valor' => 'required|numeric',
            'quantidade' => 'required|numeric',
            'tamanho' => 'required'
        ];
    }

    public function messages(){
        return [
            'required' => 'O campo :attribute é obrigatório.',
            'numeric' => 'O campo :attribute deve ser preenchido com valores numéricos.',
            'min:5' => 'O campo :attribute requer um mínimo de 5 caracteres.',
            'max:500' => 'O campo :attribute não pode exceder 500 caracteres.'
        ];
    }

Me baseei na forma como essas regras são definidas na função rules; infelizmente, as duas ultimas não foram identificadas, e a view simplesmente exibiu as mensagens padrão em inglês no lugar das minhas...

No final, acabei tornando as mensagens específicas para os respectivos campos, e sem informar os valores:

    public function messages(){
        return [
            'required' => 'O campo :attribute é obrigatório.',
            'numeric' => 'O campo :attribute deve ser preenchido com valores numéricos.',
            'nome.min' => 'O campo :attribute requer um mínimo de 5 caracteres.',
            'descricao.max' => 'O campo :attribute não pode exceder 500 caracteres.'
        ];
    }

Ainda assim gostaria de saber se o que eu quero fazer é possível. Ainda não encontrei nada na web, e agradeceria qualquer ajuda.

[]s

3 respostas
solução!

Oi Maykon, tudo bom?

Pela documentação , bastaria você passar o nome da validação, sem os valores especificos e resgatar eles pela variavel. Algo como:

    public function messages(){
        return [
            'required' => 'O campo :attribute é obrigatório.',
            'numeric' => 'O campo :attribute deve ser preenchido com valores numéricos.',
            'nome.min' => 'O campo :attribute requer um mínimo de :min caracteres.',
            'descricao.max' => 'O campo :attribute não pode exceder :max caracteres.'
        ];
    }

Qualquer problema é só falar.

Abraço

Não era bem isso o que eu queria, mas ajudou assim mesmo!

Queria que os valores de min e max fossem genéricos e não ligados a um campo especifico, mas pelo seu exemplo e pela documentação que você passou, vi que é possível fazer o que eu queria de maneira indireta, passando apenas min e max, sem o nome dos campos, já que posso pegar os valores de min e max definidos no método rules.

Fiz algumas experiências como no código abaixo e deram certo. Todas as vezes ele identificava corretamente o atributo e o valor definido para ele no rules como mínimo ou máximo.

<?php

namespace estoque\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ProdutosRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'nome' => 'required|min:5',
            'descricao' => 'required|max:500',
            'valor' => 'required|numeric',
            'quantidade' => 'required|numeric',
            'tamanho' => 'required|min:3|max:100'
        ];
    }

    public function messages(){
        return [
            'required' => 'O campo :attribute é obrigatório.',
            'numeric' => 'O campo :attribute deve ser preenchido com valores numéricos.',
            'min' => 'O campo :attribute requer um mínimo de :min caracteres.',
            'max' => 'O campo :attribute não pode exceder :max caracteres.'
        ];
    }

}

No código acima, defini como regras um valor mínimo de 5 para o Nome, um valor mínimo de 3 para o Tamanho, um tamanho máximo de 500 para a Descrição e outro de 100 para Tamanho. Em todos os testes o atributo foi associado ao tamanho correto definido nas regras sem precisar associar a mensagem em si a um campo específico.

Obrigado.

Sugiro você pesquisar e colocar seu locale e traduções em português pra evitar ficar colocando mensagens genéricas nos Form Requests apenas para traduzir os termos em inglês.

Essas mensagens dentro do Form Request são ideais para casos onde vc deseja uma mensagem customizada apenas para aquela Request e não uma tradução.

Aqui um exemplo https://github.com/enniosousa/laravel-5.5-pt-BR-localization

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software