How add Custom Validation Rules when using Form Request Validation in Laravel 5 How add Custom Validation Rules when using Form Request Validation in Laravel 5 laravel laravel

How add Custom Validation Rules when using Form Request Validation in Laravel 5


While the above answer is correct, in a lot of cases you might want to create a custom validation only for a certain form request. You can leverage laravel FormRequest and use dependency injection to extend the validation factory. I think this solution is much simpler than creating a service provider.

Here is how it can be done.

use Illuminate\Validation\Factory as ValidationFactory;class UpdateMyUserRequest extends FormRequest {    public function __construct(ValidationFactory $validationFactory)    {        $validationFactory->extend(            'foo',            function ($attribute, $value, $parameters) {                return 'foo' === $value;            },            'Sorry, it failed foo validation!'        );    }    public function rules()    {        return [            'username' => 'foo',        ];    }}


Using Validator::extend() like you do is actually perfectly fine you just need to put that in a Service Provider like this:

<?php namespace App\Providers;use Illuminate\Support\ServiceProvider;class ValidatorServiceProvider extends ServiceProvider {    public function boot()    {        $this->app['validator']->extend('numericarray', function ($attribute, $value, $parameters)        {            foreach ($value as $v) {                if (!is_int($v)) {                    return false;                }            }            return true;        });    }    public function register()    {        //    }}

Then register the provider by adding it to the list in config/app.php:

'providers' => [    // Other Service Providers    'App\Providers\ValidatorServiceProvider',],

You now can use the numericarray validation rule everywhere you want


The accepted answer works for global validation rules, but many times you will be validating certain conditions that are very specific to a form. Here's what I recommend in those circumstances (that seems to be somewhat intended from Laravel source code at line 75 of FormRequest.php):

Add a validator method to the parent Request your requests will extend:

<?php namespace App\Http\Requests;use Illuminate\Foundation\Http\FormRequest;use Validator;abstract class Request extends FormRequest {    public function validator(){        $v = Validator::make($this->input(), $this->rules(), $this->messages(), $this->attributes());        if(method_exists($this, 'moreValidation')){            $this->moreValidation($v);        }        return $v;    }}

Now all your specific requests will look like this:

<?php namespace App\Http\Requests;use App\Http\Requests\Request;class ShipRequest extends Request {    public function rules()    {        return [            'shipping_country' => 'max:60',            'items' => 'array'        ];    }    // Here we can do more with the validation instance...    public function moreValidation($validator){        // Use an "after validation hook" (see laravel docs)        $validator->after(function($validator)        {            // Check to see if valid numeric array            foreach ($this->input('items') as $item) {                if (!is_int($item)) {                    $validator->errors()->add('items', 'Items should all be numeric');                    break;                }            }        });    }    // Bonus: I also like to take care of any custom messages here    public function messages(){        return [            'shipping_country.max' => 'Whoa! Easy there on shipping char. count!'        ];    }}