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.