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

Recuperar campos preenchidos após validação da Request Laravel falhar

Galera,

No curso de Laravel II, quando criei a validação utilizando o comando

php artisan make:request

No método

public function rules()

Criei minhas regras para validação de preenchimento do formulário, existe alguma forma de personalizar o redirecionamento quando a validação falhar?

Pois estou criando um formulário de contato, quando a validação falha, o Laravel redireciona corretamente para a página com os erros, mas com o formulário vazio, gostaria de recuperar os valores dos campos.

Muito obrigado, Leonardo Brito

5 respostas

Oi Leonardo, tudo bom?

Parece que seu problema está no redirecionamento automatico fornecido pela classe ValidatesRequest, essa classe é chamada automaticamente após a validação. Se você quiser, sempre pode criar um Validator manualmente:

https://laravel.com/docs/5.4/validation#manually-creating-validators

Assim, você mesmo gera seu redirect e passa o que quiser nele =)

// aqui passamos os dados do nosso formulario para o validator no primeiro parametro e no segundo algumas regras de validação
$validator = Validator::make($request->all(), [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ]);
// se o validator falhar, a gente cria um direcionamento direferente! E também jogamos os erros devolvidos pelo Validator de volta para nossa view.
        if ($validator->fails()) {
            return redirect('post/create')
                        ->withErrors($validator)
                        ->withInput();
        }

Qualquer dificuldade, compartilha com a gente!

Abraço e bons estudos.

Não sei o que ocorre, mas não funcionou com a validação manual.

Segue o meu controller:

class ContactController extends Controller {

    public function show(){

        $subjects = Subject::all();
        $subjects = $subjects->sortBy('name');

        return view('pages.contact')->with('subjects', $subjects);
    }

    public function send(){

        $params = Request::all();

        $validator = Validator::make(Request::all(), [
                    'name' => 'required|min:10',
                ]);


                if ($validator->fails()) {
                    return redirect('/contato')
                                ->withErrors($validator)
                                ->withInput();
                }


        $contact = Contact::create($params);

        Mail::send('emails.contact-answer', ['contact' => $contact], function($message) use ($contact){

            $message->to($contact->email, $contact->name)->subject($contact->subject->name);

        });

        Mail::send('emails.contact-receive', ['contact' => $contact], function($message) use ($contact){

            $message->to('contato@comacomgula.com.br', 'Contato')->subject($contact->subject->name);

        });

        Session::flash('sended', 'ok');

        return redirect('/contato');
    }
}

Tentei sobrescrever o método response da classe ContactRequest, mas também não funcionou:

    public function response(array $errors)
    {
       return Redirect::back()->withInput()->withErrors($errors);
    }

Os erros aparecem corretamente após a alteração do método, mas o withInput() não retorna os campos para que o usuário continue preenchendo.

O que vocês acham que pode estar errado?

Esqueci de comentar antes, estou usando o Laravel 5.4 com o Blade.

Não sei o que ocorre, mas não funcionou com a validação manual.

Segue o meu controller:

class ContactController extends Controller {

    public function show(){

        $subjects = Subject::all();
        $subjects = $subjects->sortBy('name');

        return view('pages.contact')->with('subjects', $subjects);
    }

    public function send(){

        $params = Request::all();

        $validator = Validator::make(Request::all(), [
                    'name' => 'required|min:10',
                ]);


                if ($validator->fails()) {
                    return redirect('/contato')
                                ->withErrors($validator)
                                ->withInput();
                }


        $contact = Contact::create($params);

        Mail::send('emails.contact-answer', ['contact' => $contact], function($message) use ($contact){

            $message->to($contact->email, $contact->name)->subject($contact->subject->name);

        });

        Mail::send('emails.contact-receive', ['contact' => $contact], function($message) use ($contact){

            $message->to('contato@comacomgula.com.br', 'Contato')->subject($contact->subject->name);

        });

        Session::flash('sended', 'ok');

        return redirect('/contato');
    }
}

Tentei sobrescrever o método response da classe Request, mas também não funcionou:

    public function response(array $errors)
    {
       return Redirect::back()->withInput()->withErrors($errors);
    }

Os erros aparecem corretamente após a alteração do método, mas o withInput() não retorna os campos para que o usuário continue preenchendo.

O que vocês acham que pode estar errado?

Esqueci de comentar antes, estou usando o Laravel 5.4 com o Blade.

Analisando melhor, vi que quando o formulário é submetido e a validação falha, a classe ContactRequest redireciona o usuário para a página que chamou a validação automaticamente.

Como o array de $erros fica na session pensei que os campos também estariam então, usando o método old do blade, consegui pegar os valores dos inputs e textarea, só o select não consegui mas, já um caminho.

        <div class="form-group">

            <label class="col-md-4 control-label">E-mail</label>  

            <div class="col-md-4 inputGroupContainer">

                <div class="input-group">

                    <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>

                    <input type="email" name="email" class="form-control" value="{{old('email')}}">

                </div>

            </div>
solução!

Consegui!!!!!!!!!!!!!!!!!!

Acrescentei um trecho no foreach que carrega as opções do formulário, recuperando então, o que foi selecionado:

        <div class="form-group"> 

            <label class="col-md-4 control-label">Assunto</label>

            <div class="col-md-4 selectContainer">

                <div class="input-group">

                    <span class="input-group-addon"><i class="glyphicon glyphicon-list"></i></span>

                    <select name="subject_id" class="form-control">

                        <option value="">Selecione o assunto</option>

                        @foreach($subjects as $s)                        

                            @if($s->id == old('subject_id'))

                                <option value="{{$s->id}}" selected>{{$s->name}}</option>                
                            @else

                                <option value="{{$s->id}}">{{$s->name}}</option>

                            @endif

                        @endforeach

                    </select>

                </div>

            </div>

        </div>        

Espero que ajude outros com o mesmo erro.

Valeu galera