Laravel 5.5 Custom Validation Rule Objects
Published on by Paul Redmond
Laravel 5.5 will introduce support for custom validation rule objects as an alternative to using Validator::extend
for custom validation rules.
To define a custom validation rule, implement the Illuminate\Contracts\Validation\Rule
interface or use a Closure. The custom rule is then used directly in a validator.
An example of a custom object validation rule might look something like:
use Illuminate\Contracts\Validation\Rule; class CowbellValidationRule implements Rule{ public function passes($attribute, $value) { return $value > 10; } public function message() { return ':attribute needs more cowbell!'; }}
With the custom rule defined, you might use it in your controller validation like so:
public function store(){ // Validation message would be "song needs more cowbell!" $this->validate(request(), [ 'song' => [new CowbellValidationRule] ]);}
The same rule as a Closure would look something like the following.
public function store(){ $this->validate(request(), [ 'song' => [function ($attribute, $value, $fail) { if ($value <= 10) { $fail(':attribute needs more cowbell!'); } }] ]);}
The custom rule examples will not run if the song
field is empty or isn’t present in the request. If you want a custom validation object to run even with the value is empty, you need to use the ImplicitRule
contract.
use Illuminate\Contracts\Validation\ImplicitRule; class CowbellValidationRule implements ImplicitRule{ public function passes($attribute, $value) { return $value > 10; } public function message() { return ':attribute needs more cowbell!'; }}
Custom validation rule objects will be an excellent alternative to Validator::extend()
style custom rules if you prefer to organize custom rules in classes. Also, jumping to the rule source code from a validator can be more convenient than searching for a custom string-based rule defined with Validator::extend
.
The Closure style custom validation rules will be nice for simple one-off needs and make it really convenient to experiment with custom validation rules without leaving the controller. You could use a Closure to experiment with a custom rule and then move it to an object if the rule proves useful.
Check out the pull request files to see how this feature was implemented and tested.
Bravo!