【问题标题】:Validation of the dynamic input field in laravellaravel 中动态输入字段的验证
【发布时间】:2021-08-13 06:53:20
【问题描述】:

我有一个表格,可以在其中动态添加行,并且用户可以为任何行提交文件。我有一个问题是如何验证文件输入?

我正在使用 jquery 动态添加/删除行:

                            var row = 

                            "<tr> <input type='hidden' name='Registration_Tag[]'' value='" + Registration_Tag + "'>" +
                            "<td class='px-6 py-4 whitespace-nowrap'>" +
                            "<div class='flex items-center'>"+
                            "<div class='ml-4'>"+
                            "<div class='text-sm font-medium text-gray-900'>"+
                            Equipment_Name+
                            "</div>"+
                            "</div>"+
                            "</div>"+
                            "</td>"+
                            "<td class='px-6 py-4 whitespace-nowrap'>"+
                            "<div class='text-sm text-gray-500'>"+
                            Registration_Tag+
                            "</div>"+
                            "</td>"+
                            "<td class='px-6 py-4 whitespace-nowrap'>"+
                            "<span"+
                            "class='px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800'>"+
                            Equipment_Status+
                            "</span>"+
                            "</td>"+
                            "<td class='py-4 whitespace-nowrap text-sm text-gray-500'>"+

                            "<div class='flex flex-wrap my-auto mb-6'>"+
                            "<div class='w-full px-3'>"+
                            "<input id='grid-password' type='file' placeholder='' name='Equipment_Cert[]'>"+
                            " <small class='text-danger'>{{ $errors->first('Equipment_Cert') }}</small>"+
                            "</div>"+
                            "</div>"+
                            "</td>"+
                            "<td class='px-6 py-4 whitespace-nowrap text-right text-sm font-medium'>"+
                            "<button type='button' class='remove-tr close'>"+
                            "<span aria-hidden='true'>&times;</span>"+
                            "</button>"+
                            "</td>"+
                            "</tr>"

                            $("#Calibration_Table").append(row);

我已经尝试过像下面这样的点符号,但对我来说仍然没有用。


                    $v = Validator::make($request->all(), [
                        'Calibration_Location'=>'required',
                            'Calibration_Category'=>'required',
                            'Date_of_Calibration' => 'required',
                            'Next_Due_Date' => 'required',
                            'Equipment_Cert.*' => 'required'
                        ]);
                    if ($v->fails()) {
                        return redirect('/Equipments/create?request_type=Update+Calibration+for+All+Category')
                                    ->withErrors($v->errors())
                                    ->withInput();
                    }

希望能得到你的一些建议。提前致谢

【问题讨论】:

    标签: jquery laravel validation laravel-blade laravel-8


    【解决方案1】:

    文件上传输入在 Laravel 请求中的处理方式与其他类型的输入略有不同。例如,空的文本输入仍将出现在$request-&gt;input() 中。另一方面,$request-&gt;input()$request-&gt;file() 中未设置空文件输入。

    您的示例规则'Equipment_Cert.*' =&gt; 'required' 的意思是“对于此请求中Equipment_Cert 数组中的每个字段,它都应该有一个值”。但是因为从请求中去除了空文件输入,所以没有 Equipment_Cert 数组,所以该数组中没有元素可以应用此规则。

    如果您想确保动态表单中的每一行都上传了一个文件元素,您可以执行以下操作:

    // I picked this field to count because it's a text input in your dynamic row
    $dynamicRowCount = is_array($this->input('Registration_Tag')) ? count($this->input('Registration_Tag')) : 0;
    
    $v = Validator::make($request->all(), [
        'Calibration_Location'=>'required',
        'Calibration_Category'=>'required',
        'Date_of_Calibration' => 'required',
        'Next_Due_Date' => 'required',
        'Equipment_Cert' => [
            'required',
            'array',
            "size:$dynamicRowCount",
        ],
        
        // you can still do further validation on each file if necessary
        'Equipment_Cert.*' => [
            'file',
            'size:4096',
            'mimes:pdf,docx',
        ],
    ]);
    

    使用此规则,假设动态表单上有 3 行,您将收到类似 The equipment cert must contain 3 items 的错误。如果您愿意,您可以进一步将此消息自定义为更好的内容,例如 Each equipment row requires an uploaded certificate.

    或者,如果您能够更改 HTML 表单结构,您可以将表单中的每个动态行设为自己的数组。将您的字段命名为 equipment[][name]equipment[][certificate] 之类的名称,然后您的规则可能更接近您最初尝试的内容:

    [
        'equipment.*.name' => 'required',
        'equipment.*.certificate' => 'required',
    ]
    

    【讨论】:

    • 如果你想深入了解为什么 Laravel 请求中没有空文件输入,请查看这篇文章:joelclermont.com/post/2021-05/…
    • 感谢分享,我去看看!
    猜你喜欢
    • 2015-12-27
    • 2013-06-27
    • 2012-07-17
    • 2021-01-15
    • 1970-01-01
    • 2015-03-14
    • 2015-02-24
    • 1970-01-01
    • 2017-11-09
    相关资源
    最近更新 更多