Back to All Nuggets
Laravel php ⏱️ 2 min read
Production Implementation
Ask endoAI
<?php

declare(strict_types=1);

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class StoreHospitalQuoteRequest extends FormRequest
{
    public function authorize(): bool {
        return $this->user()?->can('create-quotes') ?? false;
    }

    protected function prepareForValidation(): void {
        if ($this->has('client_email')) {
            $this->merge(['client_email' => strtolower(trim((string)$this->client_email))]);
        }
    }

    public function rules(): array {
        return [
            'client_name' => ['required', 'string', 'max:255'],
            'client_email' => ['nullable', 'email:rfc,dns'],
            'currency' => ['required', Rule::in(['KES', 'USD', 'EUR'])],
            'items' => ['required', 'array', 'min:1'],
            'items.*.description' => ['required', 'string'],
            'items.*.price' => ['required', 'numeric', 'min:0.01'],
        ];
    }
}

Separating Validation Logic from Controllers in Laravel

Writing validation logic inside controller actions violates the Single Responsibility Principle. Laravel Form Request classes offer a clean, reusable architecture to handle authorization, schema validation, data sanitation, and custom error formatting.

Key Advantages

  • Automatic 422 JSON Responses: Invalid payloads are stopped before controller execution.
  • Integrated Authorization: Centralize user capability and policy checks in authorize().
  • Data Sanitization: Normalize phone numbers, emails, and currency codes in prepareForValidation().

Accelerate Your Engineering Career

Get monthly masterclasses, exclusive code snippets, and direct architectural reviews.

Become a Supporter • KES 500 / Month