Laravel Form Request Validations

In this article, we will discuss how Laravel Form Request Validations works. I think, No need to describe the features of Laravel. Because we know very well.

To start further, Just remember we need a basic Laravel setup where we implement our example. Also, you have to read our previous article on Laravel Form Validationswhich provides help to understand the working of basic validations.

Laravel provides an option to create separate Form Request class where all the validation rules work.

You can use the given command to create a Laravel Form Request Class.

php artisan make:request PostRequest

After execution, an above command the request class is created at app/Http/Request directory. The Request directory automatically created after the command executes, if not available.

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class PostRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

The Request class contains two functions authorize and rules.

The authorize function return true, an exception will be thrown when rules failed.

/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
public function authorize()
{
    return true;
}

The rules function to return the validation rules.

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        'post_title'=>'bail|required|min:6',
        'post_content'=>'required'
    ];
}

Laravel provides lots of validation rules, you can check here the complete list.

Update Controller

Now, time to update our post controller.

// First we need to update the given statement at top of the class, but after the namespace declaration.
use App\Http\Requests\PostRequest;

// store function looks.
/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(PostRequest $request)
{
    $post = new Posts;
    $post->post_title = $request->post_title;
    $post->slug = str_slug($request->post_title);
    $post->post_content = $request->post_content;
    $post->save();

    return back();
}

After updating the controller, you can check your form submission. When you submit a form then validation exceptions thrown.

Change error placement

If you want show an error message with each element and apply some styles to differentiate the error messages. Then you have to apply some logic to handle the error message as per your requirement, as given bellow.

<h3>Add New Post</h3>
<form method="post" name="addpost" id="addpost" action="{{ url('/post') }}">
    {{ csrf_field() }}
    <div class="form-group">
        <label for="post_title">Title</label>
        <input type="text" class="form-control{{ $errors->has('post_title') ? ' is-invalid' : '' }}" id="post_title" name="post_title">
        @if ($errors->has('post_title'))
            <span class="invalid-feedback">
                <strong>{{ $errors->first('post_title') }}</strong>
            </span>
        @endif
    </div>
    <div class="form-group">
        <label for="post_content">Content</label>
        <textarea name="post_content" id="post_content" class="form-control{{ $errors->has('post_content') ? ' is-invalid' : '' }}"></textarea>
        @if ($errors->has('post_content'))
            <span class="invalid-feedback">
                <strong>{{ $errors->first('post_content') }}</strong>
            </span>
        @endif
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
</form>

After execution, the error messages looks like.

Custom Error Messages

If you want to update or customize the default error messages, then you need to add messages function in your Form Request Class.

/**
 * Get the error messages for the defined validation rules.
 *
 * @return array
 */
public function messages()
{
    return [
        'post_title.required' => 'A post title is required',
        'post_content.required'  => 'A post content is required',
    ];
}

After updating the request class, then newly add  messages thrown on a failure.

Conclusion

In this article, I’m trying to explain you how Laravel Form Request Validations works. We will discuss more on validations in future article. Remember this to read out our previous article on Laravel Form Validations for better understanding. Please feel free to comments if any query.

If you like our content, please consider buying us a coffee.
Thank you for your support!
Buy Me a Coffee

Form ValidationLaravelLaravel ValidationLaravel5Laravel5.6
Comments (5)
Add Comment
  • venky

    I tried as you mention above. but after validations complete its redirect to same page , it’s not executes controller information for validations.

    • venky

      type error it’s not executes controller information after FormValidations.

  • priya chugh

    I have 12 controllers for handling different entities so do I need to make form request for each controller validation?

  • Anton

    But how to break validation next attributes after failure previous attributes?