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

Implementar regras de negócio na validação de formulários

Em relação a validação de formulário, podemos usar o "Validate" ou criar novas regras através do "Form request". No entanto, os 2 métodos se referem a criticas, simples, de campos dos formulários.

Minha dúvida é: como, e onde, implemento as criticas das regras de negócios? Exemplo, vamos supor que tenho um determinado formulário que a validação dependa dos resultados de uma pesquisas em banco de dados? Ou que dependa de uma consulta de uma api externa? Onde implemento as SQL´s e as requisições de API para validar um formulário?

2 respostas
solução!

Oi Mario! Tudo bem?

Para casos onde a validação depende de consultas ao banco de dados ou de chamadas a APIs externas, você pode utilizar o FormRequest para definir as regras básicas de validação e, em seguida, adicionar lógica personalizada no próprio controlador ou dentro do FormRequest.

Como um exemplo Prático:

  1. Criar o FormRequest: Primeiro, você cria um FormRequest para as validações básicas.

    php artisan make:request CustomFormRequest
    
  2. Adicionar Regras Básicas: Dentro do CustomFormRequest, você pode adicionar as regras básicas de validação.

    public function rules()
    {
        return [
            'campo1' => 'required|string|min:3',
            // outras regras básicas
        ];
    }
    
  3. Adicionar Lógica Personalizada: Para adicionar lógica que depende de consultas ao banco ou chamadas a APIs, você pode usar o método withValidator dentro do FormRequest.

    use Illuminate\Validation\Validator;
    
    public function withValidator(Validator $validator)
    {
        $validator->after(function ($validator) {
            if ($this->campo1RequerValidacaoEspecial()) {
                $validator->errors()->add('campo1', 'Erro personalizado baseado em regra de negócio.');
            }
        });
    }
    
    protected function campo1RequerValidacaoEspecial()
    {
        // Exemplo de consulta ao banco
        $registro = \DB::table('tabela')->where('campo', $this->campo1)->first();
        return $registro !== null;
    
        // Exemplo de chamada a API externa
        // $response = Http::get('https://api.externa.com/validar', ['param' => $this->campo1]);
        // return $response->json()['valido'] === false;
    }
    

No seu controlador, você pode continuar utilizando o FormRequest normalmente.

public function store(CustomFormRequest $request)
{
    // Lógica para salvar os dados
}

Dessa forma, você centraliza a lógica de validação no FormRequest, mantendo o controlador mais limpo e organizado.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Armando, olhando a documentação do laravel, tinha encontrado essa solução e implementado no controller.

 public function  create(Request $request)
{        
    $validator->after(function($validator) use($request) {                        

        //Regras de negócios 
   
        if ($errro) {
            $validator->errors()->add('Erro', 'XXXXXXXXXXX.');                
        }
                   
    });       
    
    if ($validator->fails()) {
        return redirect()->back()->withErrors($validator)
                                                    ->withInput();
    }
        
}

De qualquer forma, sua dica foi extremamente válida. Vou dar uma estudada do "Form Request" e tirar as regras de validação do "Contoller".

Obrigado pela dica.