Laravel Form Requests

Laravel Form Requests

Form Requests are dedicated classes for validation logic, keeping your controllers clean and your rules reusable.

1 - Creating a Form Request

php artisan make:request StorePostRequest

2 - Defining Rules and Authorization

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    public function authorize(): bool
    {
        // Return false to deny the request (403 response)
        return $this->user()->can('create', Post::class);
    }

    public function rules(): array
    {
        return [
            'title'       => ['required', 'string', 'max:255'],
            'body'        => ['required', 'string'],
            'category_id' => ['required', 'exists:categories,id'],
            'tags'        => ['array'],
            'tags.*'      => ['exists:tags,id'],
        ];
    }

    public function messages(): array
    {
        return [
            'title.required'       => 'The post title cannot be empty.',
            'category_id.exists'   => 'The selected category does not exist.',
        ];
    }
}

3 - Using the Form Request

// Type-hint the Form Request — Laravel validates automatically
public function store(StorePostRequest $request): RedirectResponse
{
    // $request->validated() returns only the validated data
    $post = Post::create($request->validated());

    return redirect()->route('posts.show', $post);
}

Note: Always use $request->validated() or $request->safe()->only([...]) when passing data to create() or update(). Never pass $request->all() directly — it bypasses mass-assignment protection.

-Tip-