У меня есть правило ( 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(); }); } }