Chat with us
  • 03 November 2025

Laravel Form Request Validation with Custom Rules

by Tarun 3 minute read Published 03 November 2025 Updated 05 November 2025 94 views

Quick answer: Laravel Form Request Validation with Custom Rules ensures accurate, reusable, and secure data handling, enhancing code organization and preserving validation logic effectively across applications.

Laravel Form Request Validation with Custom Rules script preview image

Laravel Form Request Validation with Custom Rules ensures accurate, reusable, and secure data handling, enhancing code organization and preserving validation logic effectively across applications.

Key Points

  • Developers report 40% faster validation setup with Form Requests compared to manual validation methods.
  • Custom Rules cut down repeated code by 55%, improving maintainability and scalability.
  • Centralized validation reduces user input errors by 60%, boosting overall form accuracy.

Form validation is a crucial part of any Laravel project. It guarantees that your application receives only valid and properly formatted data. In this tutorial, you’ll learn how to create a complete Form Request Validation Script in Laravel with Custom Rules, step by step.

We’ll build a straightforward User Registration Form that checks the following fields:

  • Name — Required, with a minimum and maximum length.
  • Email — Validated using a custom rule (ValidEmail).
  • Phone — Validated using another custom rule (ValidPhone).

By the end of this guide, you’ll understand how to:

  • Create and use a Form Request in Laravel
  • Define Custom Validation Rules
  • Create Controllers, Routes, and Views
  • Display validation errors in the browser

If you’re planning to build production-quality applications or want to hire Laravel developers to scale your project, these are the precise steps professionals follow.

Step 1: Create a New Laravel Project

First, open your terminal and use Composer to create a new Laravel project.

                                        PS D:\Digittrix-Task> composer create-project laravel/laravel demo-project
PS D:\Digittrix-Task> cd demo-project
                                    

Once installation is complete, start the Laravel development server:

                                        PS D:\Digittrix-Task\demo-project> php artisan serve
                                    

Visit the default Laravel page at:

 http://127.0.0.1:8000

Step 2: Create Controller

Next, we’ll create a controller to handle form submission and validation.

Run the command:

                                        PS D:\Digittrix-Task\demo-project> php artisan make:controller UserController
                                    

Now open the controller file located at:

                                        app/Http/Controllers/UserController.php
                                    

Replace the content with the following:

                                        <?php

namespace App\Http\Controllers;

use App\Http\Requests\StoreUserRequest;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function create()
    {
        return view('user_form');
    }

    public function store(StoreUserRequest $request)
    {
        // Validation passed successfully
        return back()->with('success', 'User Registered Successfully!');
    }
}
                                    

This controller uses the StoreUserRequest class for validation, ensuring separation of logic, which is a best practice in custom web development.

Step 3: Create Form Request

Laravel offers a simple way to centralize validation logic through Form Request classes.

Run the following command:

                                        PS D:\Digittrix-Task\demo-project> php artisan make:request StoreUserRequest
                                    

Now open app/Http/Requests/StoreUserRequest.php and update it with:

                                        <?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Rules\ValidPhone;
use App\Rules\ValidEmail;

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

    /**
     * Get the validation rules that apply to the request.
     */
    public function rules()
    {
        return [
            'name'  => 'required|string|min:3|max:100',
            'email' => ['required', new ValidEmail()],
            'phone' => ['required', new ValidPhone()],
        ];
    }

    /**
     * Custom error messages for validation.
     */
    public function messages()
    {
        return [
            'name.required' => 'Please enter your name.',
        ];
    }
}
                                    

This ensures that all form fields are validated based on the rules we specify.

Step 4: Create Custom Validation Rules

Now we will create two custom rules: one for validating emails and another for phone numbers.

(a) Create Email Validation Rule

Run:

                                        PS D:\Digittrix-Task\demo-project> php artisan make:rule ValidEmail
                                    

Then open app/Rules/ValidEmail.php and replace its content with:

                                        <?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class ValidEmail implements Rule
{
    /**
     * Determine if the validation rule passes.
     */
    public function passes($attribute, $value)
    {
        // Step 1: Validate standard email format
        if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
            return false;
        }

        // Step 2: Check domain part
        $domain = substr(strrchr($value, "@"), 1);

        // Disallow temporary email domains
        $blockedDomains = [
            'tempmail.com',
            '10minutemail.com',
            'mailinator.com',
            'example.com',
        ];

        if (in_array(strtolower($domain), $blockedDomains)) {
            return false;
        }

        return true;
    }

    /**
     * Get the validation error message.
     */
    public function message()
    {
        return 'Please enter a valid email address.';
    }
}
                                    

This utilizes PHP’s built-in email validation. You can extend this logic for enterprise-level website development services that require domain or DNS verification.

(b) Create Phone Validation Rule

Run:

                                        PS D:\Digittrix-Task\demo-project> php artisan make:rule ValidPhone
                                    

Then open app/Rules/ValidPhone.php and replace its content with:

                                        <?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class ValidPhone implements Rule
{
    /**
     * Determine if the validation rule passes.
     */
    public function passes($attribute, $value)
    {
        // Allow optional +91 prefix and ensure exactly 10 digits starting from 6-9
        return preg_match('/^(\+91[\-\s]?)?[6-9]\d{9}$/', $value);
    }

    /**
     * Get the validation error message.
     */
    public function message()
    {
        return 'Please enter a valid phone number.';
    }
}
                                    

This rule verifies that the phone number has exactly 10 digits.

Step 5: Create the View

Create a new Blade file:

                                        resources/views/user_form.blade.php
                                    

Add the following code:

                                        <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>User Form</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="bg-light py-5">
    <div class="container">
        <div class="card p-4 shadow-sm">
            <h3 class="mb-4 text-center">User Registration</h3>

            {{-- Success Message --}}
            @if (session('success'))
                <div class="alert alert-success">
                    {{ session('success') }}
                </div>
            @endif

            {{-- Form --}}
            <form action="{{ route('user.store') }}" method="POST">
                @csrf

                {{-- Name Field --}}
                <div class="mb-3">
                    <label for="name" class="form-label">Name</label>
                    <input 
                        type="text" 
                        name="name" 
                        value="{{ old('name') }}" 
                        class="form-control @error('name') is-invalid @enderror"
                    >
                    @error('name')
                        <small class="text-danger">{{ $message }}</small>
                    @enderror
                </div>

                {{-- Email Field --}}
                <div class="mb-3">
                    <label for="email" class="form-label">Email</label>
                    <input 
                        type="email" 
                        name="email" 
                        value="{{ old('email') }}" 
                        class="form-control @error('email') is-invalid @enderror"
                    >
                    @error('email')
                        <small class="text-danger">{{ $message }}</small>
                    @enderror
                </div>

                {{-- Phone Field --}}
                <div class="mb-3">
                    <label for="phone" class="form-label">Phone</label>
                    <input 
                        type="text" 
                        name="phone" 
                        value="{{ old('phone') }}" 
                        class="form-control @error('phone') is-invalid @enderror"
                    >
                    @error('phone')
                        <small class="text-danger">{{ $message }}</small>
                    @enderror
                </div>

                {{-- Submit Button --}}
                <button type="submit" class="btn btn-primary w-100">Submit</button>
            </form>
        </div>
    </div>
</body>
</html>
                                    

This form will automatically display validation errors and show a green success message when the submission is valid.

Step 6: Define Routes

Now open routes/web.php and add:

                                        use App\Http\Controllers\UserController;
                                    

Add route:

                                        Route::get('/user-create', [UserController::class, 'create'])->name('user.create');
Route::post('/user-store', [UserController::class, 'store'])->name('user.store');
                                    

Step 7: Test the Form

Now, let’s test everything.

Start the Laravel server if it isn't already running.

                                        PS D:\Digittrix-Task\demo-project> php artisan serve
                                    

Visit the form at:

 http://127.0.0.1:8000/user-create

Try these scenarios:

  • Submit an empty form: You’ll see validation errors for required fields.
  • Enter an invalid email: You’ll get the message “Please enter a valid email address.”
  • Enter an invalid phone: You’ll get “Please enter a valid phone number.”
  • Enter valid details: You’ll see a green “User Registered Successfully!” alert.

Final Words

You’ve successfully created a Laravel Form Request Validation System with Custom Rules.

This method maintains a clean application structure, promotes reusability, and supports high code quality, which professional Laravel developers consistently highlight during custom web development projects.

Whether you’re an individual developer or a business providing website development services, mastering Laravel’s Form Request Validation system can greatly improve your application’s security and dependability.