Form Requests are dedicated classes for validation logic, keeping your controllers clean and your rules reusable.
php artisan make:request StorePostRequest
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.',
];
}
}
// 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);
}