All Validation lessons

Form requests

5 min read

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.