monooso / apposite
Conditionally apply validation rules in Laravel
Installs: 1 876
Dependents: 0
Suggesters: 0
Security: 0
Stars: 36
Watchers: 4
Forks: 3
Open Issues: 2
Requires
- php: ^8.0
- illuminate/contracts: ^8.22.1
- illuminate/support: ^8.22.1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.15
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.3
- squizlabs/php_codesniffer: ^3.5
README
About Apposite
Apposite makes it easy to conditionally apply Laravel validation rules, even when you don't have access to the validator instance.
Requirements and installation
Select the appropriate branch for your version of Laravel.
Install Apposite using Composer:
composer require monooso/apposite
Usage
Apposite provides three custom Laravel validation rules:
ApplyWhen
Use ApplyWhen
to apply one or more validation rules when a condition is met. For example, validate the email
field if the contact_method
is "email".
The ApplyWhen
constructor expects two arguments:
- A conditional, which determines whether the validation rules are applied. This may be a boolean value, or a closure which returns a boolean.
- The validation rules to apply if the conditional evaluates to
true
. The may be in any format recognised by the Laravel validator.
For example:
new ApplyWhen($foo === $bar, 'required|string|min:10'); new ApplyWhen(function () { return random_int(1, 10) % 2 === 0; }, ['required', 'string', 'min:10']);
Add the ApplyWhen
rule to your validation rules array in the normal way.
public function store(Request $request) { $rules = [ 'contact_method' => ['required', 'in:email,phone'], 'email' => [ new ApplyWhen($request->contact_method === 'email', ['required', 'email', 'max:255']), ], ]; $validated = $this->validate($rules); }
ApplyUnless
ApplyUnless
is the opposite of ApplyWhen
. Use it to apply one or more validation rules when a condition is not met.
For example:
public function store(Request $request) { $rules = [ 'contact_method' => ['required', 'in:email,phone'], 'email' => [ new ApplyUnless($request->contact_method === 'phone', ['required', 'email', 'max:255']), ], ]; $validated = $this->validate($rules); }
Refer to the ApplyWhen
documentation for full usage instructions.
ApplyMap
Use ApplyMap
when you need to choose between different sets of validation rules. For example, when validating that the chosen delivery_service
is offered by the chosen delivery_provider
.
public function store(Request $request) { $rules = [ 'delivery_provider' => ['required', 'in:fedex,ups,usps'], 'delivery_service' => [ 'required', new ApplyMap($request->delivery_provider, [ 'fedex' => 'in:one_day,two_day', 'ups' => 'in:overnight,standard', 'usps' => 'in:two_day,someday', ]), ], ]; $validated = $this->validate($rules); }
The ApplyMap
constructor expects two arguments:
- The "key" value, which determines which rules to apply (if any). For example, "fedex".
- A "map" of keys to validation rules. The validation rules may be in any format recognised by the Laravel validator.
License
Apposite is open source software, released under the MIT license.