Beschrijving
Verplaats de validatie en autorisatie van requests naar toegewijde Form Request-classes in plaats van naar controllers.
Aanbevolen situatie
Gebruik dit voor controller-acties en endpoints die niet-triviale gebruikersinvoer accepteren.
Menselijke begeleiding
Laravel Form Request-classes halen validatie- en autorisatielogica uit controllers en plaatsen deze in toegewijde classes. Door een Form Request te type-hinten in een controllermethode wordt automatisch de validatie en autorisatie uitgevoerd voordat de methode draait. Zo blijven controllers dun en is de validatielogica herbruikbaar.
Waarom
- Scheiding van verantwoordelijkheden: Validatielogica leeft in een eigen class en vervuilt de controllermethoden niet
- Herbruikbaarheid: Dezelfde Form Request kan in meerdere controllers of acties worden gebruikt
- Automatische uitvoering: Het type-hinten van de Form Request voert validatie en autorisatie automatisch uit, geen handmatige
validate()-aanroep nodig - Veiligheid: Het gebruik van
$request->validated()zorgt ervoor dat alleen gevalideerde data aan mass operations wordt doorgegeven, waardoor niet-gevalideerde velden niet kunnen doorlekken
Geschikt voor
- Elke controllermethode die gebruikersinvoer accepteert
- Formulieren met meerdere validatieregels
- Endpoints waar autorisatie en validatie nauw met elkaar samenhangen
- API's waar consistente validatie-foutmeldingen belangrijk zijn
Minder geschikt voor
- Extreem eenvoudige endpoints met één of twee triviale validatieregels
- Closure-gebaseerde routes in prototyping- of testscenario's
Voorbeelden
Haal validatie naar Form Requests
// Bad: inline validation in controllers
public function store(Request $request)
{
$request->validate([
'title' => 'required|max:255',
'body' => 'required',
]);
}
// Good: dedicated Form Request class
public function store(StorePostRequest $request)
{
Post::create($request->validated());
}
Gebruik altijd validated()
Gebruik nooit $request->all() voor mass operations:
// Bad: includes unvalidated fields
Post::create($request->all());
// Good: only validated data
Post::create($request->validated());
Geef de voorkeur aan array-notatie voor regels
Array-syntax is beter leesbaar en combineert netjes met Rule::-objecten. Geef er de voorkeur aan in nieuwe code, maar sluit aan bij de bestaande conventie:
// Preferred for new code
'email' => ['required', 'email', Rule::unique('users')],
// Follow existing convention if the project uses string notation
'email' => 'required|email|unique:users',
Gebruik Rule::when() voor voorwaardelijke validatie
'company_name' => [
Rule::when($this->account_type === 'business', ['required', 'string', 'max:255']),
],
Gebruik de after()-methode voor custom validatie
Gebruik after() in plaats van withValidator() voor custom validatielogica die van meerdere velden afhangt:
public function after(): array
{
return [
function (Validator $validator) {
if ($this->quantity > Product::find($this->product_id)?->stock) {
$validator->errors()->add('quantity', 'Not enough stock.');
}
},
];
}
Meer info
- Laravel Form Request Validation Documentation
- Laravel Validation Rules Documentation
- Use Route Model Binding
- Use Action Classes for Business Logic
- Laravel Boost Best Practices PR
Boost-richtlijn
---
title: Use Form Request Classes
description: Move request validation and authorization into dedicated Form Request classes instead of controllers.
recommended_situation: Use for controller actions and endpoints that accept non-trivial user input.
---
- Create Form Request classes for request validation and authorization instead of validating inline in controllers.
- Type-hint the Form Request on controller actions so Laravel runs authorization and validation automatically.
- Pass `$request->validated()` downstream for mass assignment, actions, or services; do not use `$request->all()`.
- Prefer readable rule definitions and keep conditional or cross-field validation inside the Form Request.