即使文件存在,Laravel文件上传所需的验证仍会触发。

8

我有一个表单,其中一个字段是名为attachment的文件,在我的请求中,该字段的验证要求在另一个名为requestType的字段设置为值sick时存在,使用required_if验证规则。

我面临的问题是,即使我上传了有关输入字段的文件,请求类中的验证规则仍然会触发:当请求类型为sick时,需要附件字段。

这是我的代码:

请注意,attachment字段上的html required属性并不是导致问题的原因,在页面加载时,它被设置为disabled,当requestType设置为sick时,disabled属性被移除。

视图

{!! Form::open(['route' => 'employee.request.store', 'class' => 'form-horizontal', 'id' => '', 'files' => 'true']) !!}

            <div class="form-group {{ $errors->first('requestType', 'has-error') }}">
                <label for="" class="col-sm-2 control-label"> {{ Lang::get('employee_request_contractor_create.request_type') }} *</label>
                <div class="col-sm-3">
                    {!! 
                        Form::select('requestType', 
                            ['' => 'Select', 'normal' => 'Normal', 'emergency' => 'Emergency', 'sick' => 'Sick'], 
                            '', 
                            ['class' => 'form-control', 'id' => 'requestType', 'required' => 'required']
                        ) 
                    !!}
                </div>
                {!! $errors->first('requestType', '<label class="col-sm-3 control-label" for="">:message</label>') !!}
            </div>

            <div class="form-group {{ $errors->first('attachment', 'has-error') }}" id="attachmentFormGroup">
                <label for="" class="col-sm-2 control-label"> {{ Lang::get('employee_request_contractor_create.attachment') }} <small>(Sick only)</small> </label>
                <div class="col-sm-3">
                    <input type="file" name="attachment" id="attachment" required="required">
                    <label>(Please provide HR with original copy)</label>
                </div>
                {!! $errors->first('attachment', '<label class="col-sm-3 control-label" for="">:message</label>') !!}
            </div>
    <!-- other form inputs and submit button -->
{!! Form::close() !!}

请求

public function rules()
{
    return [
        'requestType'   => 'required|max:255',
        'attachment'    => 'required_if:requestType,sick|mimes:pdf,jpg,png,gif,jpeg|max:512',
        /* other rules */
    ];

}

如果我删除required_if:requestType,附件上传就可以正常进行,如果在我的控制器中输出:
if(\Input::hasFile('attachment') echo 'true';

我会准确理解。

当我在我的控制器存储方法中使用dd($request)时,我看到以下内容(相关部分):

+request: ParameterBag {#227 ▼
    #parameters: array:10 [▼
      "_token" => "XkQwP608M5WQ4qtHCYN0dIVETDeqzL0E5ZI99iSf"
      "requestType" => "sick"
      "manager" => "2"
      "dateFrom" => "01-06-2015"
      "dateFromHijri" => "1436-08-14"
      "dateTo" => "02-06-2015"
      "dateToHijri" => "1436-08-15"
      "noOfDays" => "2"
      "location" => "London"
      "contactNumber" => "123456"
    ]
}

并且...

+files: FileBag {#221 ▼
    #parameters: array:1 [▼
      "attachment" => UploadedFile {#27 ▼
        -test: false
        -originalName: "test_doc.pdf"
        -mimeType: "application/pdf"
        -size: 82584
        -error: 0
      }
    ]
  }

规则是否被解雇是因为附件没有与其他请求属性一起显示出来?

更新:错误信息:

["errors"]=>
  object(Illuminate\Support\ViewErrorBag)#178 (1) {
    ["bags":protected]=>
    array(1) {
      ["default"]=>
      object(Illuminate\Support\MessageBag)#179 (2) {
        ["messages":protected]=>
        array(1) {
          ["attachment"]=>
          array(1) {
            [0]=>
            string(59) "The attachment field is required when request type is sick."
          }
        }
        ["format":protected]=>
        string(8) ":message"
      }
    }
  }

非常感谢您的帮助。谢谢!


$validator->failed() 的输出是什么?那将为您提供每个验证规则的列表。 - Robert
请看更新,我从会话中添加了错误信息,因为我没有使用验证器实例,而是使用中间件进行验证。有什么想法吗? - haakym
尝试在表单打开行中删除对“true”的引号。您应该将其设置为布尔值,而不是字符串。 - Jan Willem
这将把文件参数设置为true,这意味着在表单标签中添加enctype="multipart/form-data"。 - Jan Willem
为什么你的“attachment”输入不在“$request”对象中? - Luciano
显示剩余2条评论
1个回答

5

requestType 没有设置为 sick 时,输入被禁用,附件不包含在发送到服务器的 POST 请求中。这就是为什么 Laravel 的请求验证文件会触发,因为它甚至没有看到 POST 数据中的值。为解决此问题,只需在 attachment 字段的验证字符串中添加 sometimes。代码应如下所示:

public function rules()
{
    return [
        'requestType'   => 'required|max:255',
        'attachment'    => 'sometimes|required_if:requestType,sick|mimes:pdf,jpg,png,gif,jpeg|max:512',
        /* other rules */
    ];

} 

这是来自 Laravel 文档 的一段摘录,涉及此问题:

In some situations, you may wish to run validation checks against a field only if that field is present in the data being validated. To quickly accomplish this, add the sometimes rule to your rule list:

$v = Validator::make($data, [

   'email' => 'sometimes|required|email',

]);

In the example above, the email field will only be validated if it is present in the $data array.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接