Video
Description
Fluent and extremely fast validation for Laravel
Write Laravel validation rules with IDE autocompletion instead of memorizing string syntax. Each rule type exposes only the methods that apply to it: FluentRule::string() won't offer digits(), FluentRule::date() won't offer mimes(). each() and children() keep parent and child rules in one place instead of scattered across dot-notation keys. For large arrays, the HasFluentRules trait makes wildcard validation up to 160x faster.
// Before'name' => 'required|string|min:2|max:255','email' => ['required', 'email', Rule::unique('users')->ignore($id)],'role' => Rule::when($isAdmin, 'required|string|in:admin,editor'),'items' => 'array','items.*.id' => 'required|integer|exists:items,id','items.*.name' => 'required|string|max:255', // After'name' => FluentRule::string('Full Name')->required()->min(2)->max(255),'email' => FluentRule::email('Email')->required()->unique('users', 'email', fn ($r) => $r->ignore($id)),'role' => FluentRule::string()->when($isAdmin, fn ($r) => $r->required()->in(['admin', 'editor'])),'items' => FluentRule::array()->each([ 'id' => FluentRule::integer()->required()->exists('items', 'id'), 'name' => FluentRule::string()->required()->max(255),]),
Performance
Type starters
Laravel's Rule |
FluentRule equivalent |
|---|---|
Rule::string() |
FluentRule::string() |
Rule::numeric() |
FluentRule::numeric() / FluentRule::integer() |
Rule::date() |
FluentRule::date() |
Rule::dateTime() |
FluentRule::dateTime() |
Rule::email() |
FluentRule::email() |
Rule::file() |
FluentRule::file() |
Rule::imageFile($allowSvg) |
FluentRule::image()->allowSvg() (or just image()) |
Rule::array($keys = null) |
FluentRule::array($keys) |
Rule::dimensions([...]) |
FluentRule::image()->minWidth(...)->ratio(...) |
Set membership and value spaces
Laravel's Rule |
FluentRule equivalent |
|---|---|
Rule::in([...]) |
->in([...]) (on any typed builder) |
Rule::notIn([...]) |
->notIn([...]) |
Rule::contains([...]) |
FluentRule::array()->contains(...) |
Rule::doesntContain([...]) |
FluentRule::array()->doesntContain(...) |
Rule::enum(Status::class) |
FluentRule::enum(Status::class) / ->enum(...) |
Rule::anyOf([...]) |
FluentRule::anyOf([...]) |
Database lookups
Laravel's Rule |
FluentRule equivalent |
|---|---|
Rule::unique('users')->where(...) |
->unique('users', 'col', fn ($r) => $r->where(...)) |
Rule::exists('roles')->where(...) |
->exists('roles', 'col', fn ($r) => $r->where(...)) |
Conditional callables
Laravel's Rule |
FluentRule equivalent |
|---|---|
Rule::when($cond, $rules, $default) |
->when($cond, fn ($r) => …, fn ($r) => …) |
Rule::unless($cond, $rules, $default) |
->when(! $cond, …) |
Rule::requiredIf(fn () => …) |
->requiredIf(fn () => …) |
Rule::requiredUnless(fn () => …) |
->requiredUnless(fn () => …) |
Rule::excludeIf(fn () => …) |
->excludeIf(fn () => …) |
Rule::excludeUnless(fn () => …) |
->excludeUnless(fn () => …) |
Rule::prohibitedIf(fn () => …) |
->prohibitedIf(fn () => …) |
Rule::prohibitedUnless(fn () => …) |
->prohibitedUnless(fn () => …) |
Iteration
Laravel's Rule |
FluentRule equivalent |
|---|---|
Rule::forEach(fn ($v, $k) => …) |
FluentRule::array()->each(FluentRule::string()->…) |
Authorization (escape hatch only)
Laravel's Rule |
FluentRule equivalent |
|---|---|
Rule::can('ability', …$args) |
->rule(['can', 'ability', …$args]) |
FluentRule additions with no Laravel equivalent
| Method | What it does |
|---|---|
->each([key => FluentRule, …]) |
Co-locate wildcard child rules |
->children([key => FluentRule, …]) |
Co-locate fixed-key child rules |
->label('Full Name') |
Replaces :attribute in messages |
->message('…') / ->messageFor('…', '…') |
Per-rule custom messages |
->fieldMessage('…') |
Field-level fallback message |
->whenInput(fn ($input) => …) |
Branch on full input at validation time |
Related Content on Laravel Daily
Video
Recent Courses on Laravel Daily
[NEW] Practical Laravel Security: Packages, Secrets, Supply-Chain Attacks
7 lessons
43 min read
Laravel 13 Starter Kit Teams and Customizations
10 lessons
33 min
Roles and Permissions in Laravel 13
14 lessons
57 min