Использование сложного правила условной проверки в FormRequest в Laravel - PullRequest
0 голосов
/ 13 сентября 2018

Я занимаюсь разработкой веб-приложения с использованием Laravel.То, что я делаю сейчас, - это создание FirmRequest для проверки.

Это мой FormRequest.

use Illuminate\Foundation\Http\FormRequest;

class StoreVacancy extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'title' => 'required',
            'type' => 'required',
            'complex_field' => ...need complex conditional validation based on the type field
        ];
    }
}

Если я не использовал FormRequest, я могу создать валидатор в контроллере и установить сложное правило условной проверки, например, так:

$v = Validator::make($data, [
    //fields and rules
]);

$v->sometimes('reason', 'required|max:500', function ($input) {
    return $input->games >= 100;
});

Но проблема в том, что я не создаю валидатор в контроллере.Но я использую FormRequest.Как я могу добиться того же в FormRequest?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Вы можете проверить функцию createDefaultValidator в https://github.com/laravel/framework/blob/5.7/src/Illuminate/Foundation/Http/FormRequest.php. Мы переопределим эту функцию и добавим наше условие

    /**
     * Add Complex Conditional Validation to the validator instance.
     *
     * @param  \Illuminate\Validation\Factory  $factory
     * @return \Illuminate\Validation\Validator
     */
    public function validator($factory)
    {
        $validator = $factory->make(
            $this->validationData(),
            $this->container->call([$this, 'rules']),
            $this->messages(),
            $this->attributes()
        );

        $validator->sometimes('reason', 'required|max:500', function ($input) {
            return $input->games >= 100;
        });

        return $validator;
    }
0 голосов
/ 13 сентября 2018

Вы можете вручную настроить правила в зависимости от входных данных:

class StoreVacancy extends FormRequest
{
    public function rules()
    {
        $reason = $this->request->get('reason'); // Get the input value
        $rules = [
            'title' => 'required',
            'type'  => 'required',
        ];

        // Check condition to apply proper rules
        if ($reason >= 100) {
            $rules['complex_field'] = 'required|max:500';
        }

        return $rules;
    }
}

Это не то же самое, что иногда , но выполняет ту же работу.

...