Как добавить пользовательский валидатор в свой FormRequest?

У меня есть правило ( foobar ), которое не встроено в Laravel, которое я хочу использовать в моем расширенном FormRequest . Как создать настраиваемый валидатор для этого конкретного правила?

 public function rules() { return [ 'id' => ['required', 'foobar'] ]; } 

Я знаю, что Validator::extend существует, но я не хочу использовать фасады. Я хочу, чтобы он был «встроен» в мой FormRequest . Как мне это сделать и возможно ли это?

Возможно, вы создали свой собственный метод проверки, создав свойство validator для своего класса и установив его в app('validator') . Затем вы можете использовать этот пробег свойства, как и с фасадом.

Создайте метод __construct и добавьте следующее:

 public function __construct() { $this->validator = app('validator'); $this->validateFoobar($this->validator); } 

Затем создайте новый метод под названием validateFoobar который принимает свойство validator в качестве первого аргумента и работает на нем, как и с фасадом.

 public function validateFoobar($validator) { $validator->extend('foobar', function($attribute, $value, $parameters) { return ! MyModel::where('foobar', $value)->exists(); }); } 

Более подробная информация о extend доступна здесь .

В конце концов, ваш FormRequest может выглядеть так:

 <?php namespace App\Http\Requests; use App\Models\MyModel; use App\Illuminate\Foundation\Http\FormRequest; class MyFormRequest extends FormRequest { public function __construct() { $this->validator = app('validator'); $this->validateFoobar($this->validator); } public function rules() { return [ 'id' => ['required', 'foobar'] ]; } public function messages() { return [ 'id.required' => 'You have to have an ID.', 'id.foobar' => 'You have to set the foobar value.' ]; } public function authorize() { return true; } public function validateFoobar($validator) { $validator->extend('foobar', function($attribute, $value, $parameters) { return ! MyModel::where('category_id', $value)->exists(); }); } }