php 一次验证多个表单

kadbb459  于 2023-10-15  发布在  PHP
关注(0)|答案(1)|浏览(112)

我们的应用程序在一个页面上有多个相同的表单。在提交数据之前,我想用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只有一个元素。它验证第一个表单,失败,然后向我发送该表单的错误。我想一次为每个形式的错误。
这可能吗?

chhqkbe1

chhqkbe11#

我一次发完所有的表格是不行的。相反,我创建了多个请求,如下所示:

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([]);
    });

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

相关问题