一次验证多个表单

问题描述 投票:0回答:1

我们的应用程序在一个页面上有多个相同的表单。在提交数据之前,我想通过 Vue 的单个请求来验证所有表单的输入。

我想出了以下前端部分

await this.axios({
  method: 'POST',
  url: '/data/validate/MixtureFormRequest',
  data: this.forms, // array of forms with identical JSON structure.
});

MixtureFormRequest.php
只是一个请求类,看起来像这样:

class MixtureFormRequest extends FormRequest
{
    public function rules()
    {
        return [
            'key1'         => ['required'],
            'key2'         => ['required'],
        ];
    }
}

现在棘手的部分在控制器中:

Route::post('validate/{validationClass}', function (string $validationClass, Request $request) {

    $errors = [];

    foreach($request as $form) {
        $validator = app("App\\Http\\Requests\\" . $validationClass);
        $validationInstance = $validator->make($form, $validator->rules());

        if ($validationInstance->fails()) {
            $errors[] = $validationInstance->errors();
        }
    }

    return response()->jsonSuccess(['errors' => $errors]);
});

我有上面的内容,但是

$errors
只有一个元素。它验证第一个表单,失败,然后向我发送该表单的错误。我希望每个表格都能同时出现错误。

这可能吗?

php laravel vue.js axios laravel-validation
1个回答
0
投票

我无法通过一次发送所有表格来实现此目的。相反,我创建了多个请求,如下所示:

        async $validateForms(controller, forms) {
            const formsToValidate = forms.map((form) => {
                return this.$axios({
                    method: 'POST',
                    url: `/data/validate/${controller}`,
                    data: form,
                });
            });

            const results = await Promise.allSettled(formsToValidate);

            return results.map(({ reason, status }) => {
                if (status === 'rejected') {
                    return reason.data.errors;
                } else {
                    return {};
                }
            });
        },

在后端,它变得非常简单:

    Route::post('validate/{validationClass}', function (string $validationClass, Request $request) {
        app("App\\Http\\Requests\\" . $validationClass);
        return response()->jsonSuccess([]);
    });

这允许前端控制针对该特定请求使用哪个验证类。

© www.soinside.com 2019 - 2024. All rights reserved.