
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!