Overview
Form Requests are Laravel classes that handle both authorization (permission checking) and validation (data rules) before any controller logic executes. This keeps controllers clean and centralizes security and validation logic.Naming Convention
Form Requests follow this pattern:app/Http/Requests/Sales/StoreSaleRequest.phpapp/Http/Requests/Sales/UpdateSaleRequest.phpapp/Http/Requests/Clients/BulkClientRequest.phpapp/Http/Requests/Products/StoreProductRequest.php
Standard Form Requests
Every module typically has three Form Request classes:- Store[Module]Request - For creating new records
- Update[Module]Request - For editing existing records
- Bulk[Module]Request - For bulk/batch operations
Core Methods
Every Form Request must implement:authorize(): bool
Checks if the user has permission to perform the action using Spatie permissions.rules(): array
Defines validation rules for the incoming data.withValidator($validator) (optional)
Add custom validation logic after basic rules pass.Real-World Example: StoreSaleRequest
Let’s examine the completeStoreSaleRequest from the Sales module:
app/Http/Requests/Sales/StoreSaleRequest.php
Key Validation Patterns
1. Permission Authorization
Use Spatie permissions to control access:'create [module]'- For Store requests'edit [module]'- For Update requests'delete [module]'- For Destroy requests
2. Conditional Validation
Make fields required based on other field values:3. Array Validation
Validate array items (like sale items):4. Complex Business Logic
UsewithValidator() for complex validations:
5. Database Validation
Validate against database state:Bulk Request Example
Bulk requests validate multiple IDs and actions:app/Http/Requests/Clients/BulkClientRequest.php
Simple Request Example
For simpler modules with less validation:app/Http/Requests/Products/BulkProductRequest.php
Controller Integration
Form Requests are type-hinted in controller methods:app/Http/Controllers/Sales/SaleController.php
Custom Error Messages
Provide user-friendly error messages:Custom Attribute Names
Make error messages more readable:Request Template
Use this template for new Form Requests:app/Http/Requests/[Module]/Store[Module]Request.php
Validation Flow
Here’s how validation flows through the system:Testing Form Requests
Form Requests can be tested independently:tests/Unit/Requests/StoreSaleRequestTest.php
Best Practices
Use Spatie Permissions
Always check permissions in the
authorize() method using Spatie’s can() method.Keep Rules Simple
Basic validation in
rules(), complex business logic in withValidator().Early Return
In
withValidator(), return early if basic validation already failed.Clear Error Messages
Provide user-friendly, actionable error messages in
messages().Common Validation Rules
Existence Rules
Existence Rules
Conditional Rules
Conditional Rules
Numeric Rules
Numeric Rules
String Rules
String Rules
Date Rules
Date Rules
Array Rules
Array Rules
Common Pitfalls
Next Steps
Business Services
Learn how services process validated data
Catalog Services
Provide data for form dropdowns
Testing
Write tests for Form Requests
Adding Modules
Complete module implementation guide