Laravel 10 Custom Validation Rule

Step 1: Install Laravel


 composer create-project laravel/laravel example-BirthYearRule

Step 2: Create Routes

routes/web.php 


    <?php
  
    use Illuminate\Support\Facades\Route;
      
    use App\Http\Controllers\CustomValidationController;
       
    /*
    |--------------------------------------------------------------------------
    | Web Routes
    |--------------------------------------------------------------------------
    |
    | Here is where you can register web routes for your application. These
    | routes are loaded by the RouteServiceProvider within a group which
    | contains the "web" middleware group. Now create something great!
    |
    */
        
    Route::get('custom-validation', [CustomValidationController::class, 'create']);
    Route::post('custom-validation', [CustomValidationController::class, 'store'])->name('custom.validation.post');

Step 3: Create Validation Rule

let's run below command and update rule validation file. 


    php artisan make:rule BirthYearRule

app/Rules/BirthYearRule.php


    <?php
  
    namespace App\Rules;
      
    use Closure;
    use Illuminate\Contracts\Validation\ValidationRule;
      
    class BirthYearRule implements ValidationRule
    {
        /**
         * Run the validation rule.
         *
         * @param  \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString  $fail
         */
        public function validate(string $attribute, mixed $value, Closure $fail): void
        {
            if(!($value >= 1980 && $value <= date('Y'))){
                $fail('The :attribute must be between 1980 to '.date('Y').'.');
            }
        }
    }

Step 4: Create Controller

app/Http/Controllers/CustomValidationController.php 


    <?php
  
    namespace App\Http\Controllers;
      
    use Illuminate\Http\Request;
    use Illuminate\View\View;
    use Illuminate\Http\RedirectResponse;
    use App\Rules\BirthYearRule;
       
    class CustomValidationController extends Controller
    {
        /**
         * Show the application dashboard.
         *
         * @return \Illuminate\Http\Response
         */
        public function create(): View
        {
            return view('forms');
        }
            
        /**
         * Show the application dashboard.
         *
         * @return \Illuminate\Http\Response
         */
        public function store(Request $request): RedirectResponse
        {
            $validatedData = $request->validate([
                    'name' => 'required',
                    'birth_year' => [
                        'required',
                        new BirthYearRule()
                    ]
                ]);
            
            /*
                $validatedData['password'] = bcrypt($validatedData['password']);
                $user = User::create($validatedData);
            */
                
            return back()->with('success', 'User created successfully.');
        }
    }

Step 6: Create View File

resources/views/forms.blade.php 


    <!DOCTYPE html>
    <html>
    <head>
        <title>Laravel Custom Validation Rule Example - webthestuff.com</title>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet">
    </head>
    <body>
        <div class="container">
          
            <h1>Laravel Custom Validation Rule Example - webthestuff.com</h1>
             
            <form method="POST" action="{{ route('custom.validation.post') }}">
            
                {{ csrf_field() }}
            
                <div class="mb-3">
                    <label class="form-label" for="inputName">Name:</label>
                    <input 
                        type="text" 
                        name="name" 
                        id="inputName"
                        class="form-control @error('name') is-invalid @enderror" 
                        placeholder="Name">
        
                    @error('name')
                        <span class="text-danger">{{ $message }}</span>
                    @enderror
                </div>
             
                <div class="mb-3">
                    <label class="form-label" for="inputEmail">Birth Year:</label>
                    <input 
                        type="text" 
                        name="birth_year" 
                        id="inputEmail"
                        class="form-control @error('birth_year') is-invalid @enderror" 
                        placeholder="Birth Year">
        
                    @error('birth_year')
                        <span class="text-danger">{{ $message }}</span>
                    @endif
                </div>
           
                <div class="mb-3">
                    <button class="btn btn-success btn-submit">Submit</button>
                </div>
            </form>
        </div>
    </body>
    </html>

Run Laravel App:


    php artisan serve

Now, Go to web browser, type the given URL and view the output:


    http://localhost:8000/custom-validation