<?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