For controllers that validate the same input across multiple actions, generate a FormRequest:
php artisan make:request StorePostRequest
class StorePostRequest extends FormRequest
{
public function authorize(): bool
{
return $this->user()->can('create', Post::class);
}
public function rules(): array
{
return [
'title' => ['required', 'string', 'max:160'],
'body' => ['required'],
];
}
public function messages(): array
{
return [
'title.required' => 'A title is required.',
];
}
}
Then type-hint it in the controller — Laravel injects it, calls authorize(), validates, and you get $request->validated() for free:
public function store(StorePostRequest $request)
{
Post::create($request->validated());
}
The controller stays one line. Validation rules are testable in isolation.