MarathonStudios MarathonStudios - 1 month ago 12
PHP Question

How do you flash Request data if a Validator fails in Laravel 5?

I've created a simple contact form in Laravel 5, using the Request object and a Validator object to check my input for errors.

The form in my view is coded in HTML, rather than the Laravel Form object, which isn't included by default in Laravel 5.

I need to set up my form so that if a validation rule fails, the user's input is flashed to the session so it doesn't disappear when the page redirects. I was able to accomplish this by putting a $request->flash() in the POST controller, before the validation code.

However, I do not want the data to be flashed (i.e, the form should be reset) if the validation passes and the form is successfully emailed. There's no apparent way for me to accomplish this in the $this->validate block, since Laravel helpfully handles the redirects automatically.

How can I tell Laravel to flash the form data ONLY if there is a validation error?

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class ContactController extends Controller
{
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
return view('contact');
}

/**
* Store a newly created resource in storage.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
// Flash current input in case the validator fails and redirects
$request->flash();

// Validate the form request, redirect on fail
$this->validate($request, [
'name' => 'required',
'email' => 'required|email',
'subject' => 'required',
'message' => 'required|min:5',
]);

// Generate email from template and send
\Mail::send('emails.feedback',
array(
'name' => $request->get('name'),
'email' => $request->get('email'),
'user_message' => $request->get('message'),
'subject' => $request->get('subject')
), function($message) use ($request)
{
$message->from( \Config::get('site.from_email') );
$message->to( \Config::get('site.contact_email') , 'Admin' );
$message->subject( \Config::get('site.name').': '. $request->get('subject') );
});

// Redirect to Contact route with success message
return \Redirect::route('contact')
->with('message', 'Thanks for contacting us!');
}


}

Answer

Just remove the following line of code:

$request->flash();

Laravel will take care of that for you by flashing the data on failed validation. The following method gets called on failed validation:

/**
 * Create the response for when a request fails validation.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  array  $errors
 * @return \Illuminate\Http\Response
 */
protected function buildFailedValidationResponse(Request $request, array $errors)
{
    if ($request->ajax() || $request->wantsJson()) {
        return new JsonResponse($errors, 422);
    }

    return redirect()->to($this->getRedirectUrl())
                    ->withInput($request->input()) // <-- Flashes inputs
                    ->withErrors($errors, $this->errorBag()); // <-- Flashes errors
}

This is the trait used in your controller for validating the request and it's located at Illuminate/Foundation/Validation, name is ValidatesRequests. Check it to clarify yourself.

Alternatively, you may do it manually if you want for any reason, check the documentation.