【问题标题】:Fatal exception "Method Illuminate\Validation\Rules\RequiredIf::__toString() must not throw an exception" when validating in laravel在 laravel 中验证时出现致命异常“Method Illuminate\Validation\Rules\RequiredIf::__toString() 不得抛出异常”
【发布时间】:2020-09-28 20:46:26
【问题描述】:

我正在使用 Laravel。我想验证一个复杂的请求输入,但是当我使用 requiredIf 方法时会启动一个致命异常,因此我无法读取验证器的所有错误。 例如,如果输入 $request->assistanceRequest['source'] 不存在,则验证不起作用,因为抛出以下异常:

Method Illuminate\Validation\Rules\RequiredIf::__toString() must not throw an exception, caught ErrorException: Undefined index: source

这是控制器中的代码:

$rules = array( 
    'assistanceRequest.requestType' => 'required|exists:request_types,variable',
    'assistanceRequest.deliveryMode' => 'required|in:NORMAL,FAST',
    'assistanceRequest.creationDate' => ['required', 'regex:@^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|1[0-9]|0[0-9]):[0-5][0-9]:[0-9]{2}$@'],
    'assistanceRequest.source' => 'required',
    'assistanceRequest.language' => ['required', 'regex:@^[A-Z]{2}$@'], 
    'assistanceRequest.country' => ['required', 'regex:@^[A-Z]{2}$@'], 
    'customer.customerId' => 'required|integer',
    'customer.login' => 'required',
    'customer.companyName' => 'required',
    'customer.phoneNumber' => 'required',
    'customer.email' => ['required', 'regex:&^\S+@\S+\.\S+$&'], 
    'vehicle.plateNumber' => 'required', 
    'vehicle.Country' => ['required', 'regex:@^[A-Z]{2}$@'], 
    'vehicle.frenchRegistration' => '',
    'vehicle.vin' => 'required|min:17|max:17',
    'vehicle.variationId' => 'required|integer|max:9999999',
    'vehicle.makeLabel' => 'required',
    'vehicle.modelLabel' => 'required',
    'vehicle.variationLabel' => 'required',
    'vehicle.bodyLabel' => Rule::requiredIf(function () use ($request) {
        return $request->assistanceRequest['source'] == "ATD"; //example problem
    }),
    'vehicle.releaseDate' => 'required|date_format:Y-m-d', 
    'vehicle.specificitiesOptions' => '',
    'vehicle.mileage' => Rule::requiredIf(function () use ($request) {
        return $request->assistanceRequest['requestType'] !== "SERVICE_PLAN"; 
    }),
    'vehicle.distanceUnit' => Rule::requiredIf(function () use ($request) {
        return $request->assistanceRequest['requestType'] !== "SERVICE_PLAN"; 
    }),
    'requestInformations.category' => Rule::requiredIf(function () use ($request) {
        return ($request->assistanceRequest['requestType'] == "TECHNICAL_DATA" or $request->assistanceRequest['requestType'] == "REPAIR_METHOD" or $request->assistanceRequest['requestType'] == "WIRE_DIAGRAM") and $request->assistanceRequest['source'] == 'ATD'; //chiedere e modificare 5
    }),
    'requestInformations.subCategory' => Rule::requiredIf(function () use ($request) {
        return ($request->assistanceRequest['requestType'] == "TECHNICAL_DATA" or $request->assistanceRequest['requestType'] == "REPAIR_METHOD" or $request->assistanceRequest['requestType'] == "WIRE_DIAGRAM") and $request->assistanceRequest['source'] == 'ATD'; //chiedere e modificare 5
    }),
    'requestInformations.informationCode' => Rule::requiredIf(function () use ($request) {
        return ($request->assistanceRequest['requestType'] == "TECHNICAL_DATA" or $request->assistanceRequest['requestType'] == "REPAIR_METHOD" or $request->assistanceRequest['requestType'] == "WIRE_DIAGRAM") and $request->assistanceRequest['source'] == 'ATD'; //chiedere e modificare 5
    }),
    'requestInformations.dataLabel' => Rule::requiredIf(function () use ($request) {
        return ($request->assistanceRequest['requestType'] == "TECHNICAL_DATA" or $request->assistanceRequest['requestType'] == "REPAIR_METHOD" or $request->assistanceRequest['requestType'] == "WIRE_DIAGRAM") and $request->assistanceRequest['source'] == 'ATD'; //chiedere e modificare 5
    }),
    'requestInformations.cuCode' => Rule::requiredIf(function () use ($request) {
        return ($request->assistanceRequest['requestType'] == "TECHNICAL_DATA" or $request->assistanceRequest['requestType'] == "REPAIR_METHOD" or $request->assistanceRequest['requestType'] == "WIRE_DIAGRAM") and $request->assistanceRequest['source'] == 'ATD'; //chiedere e modificare 5
    }),
    'requestInformations.text' => 'required',
    'requestInformations.errorCodes' => Rule::requiredIf(function () use ($request) {
        return $request->assistanceRequest['requestType'] == "BREAKDOWN" or $request->assistanceRequest['requestType'] == "ERROR_CODE";
    }),
    'requestInformations.troubles' => Rule::requiredIf(function () use ($request) {
        return $request->assistanceRequest['requestType'] == "BREAKDOWN" or $request->assistanceRequest['requestType'] == "ERROR_CODE";
    }),
    'requestInformations.controls' => Rule::requiredIf(function () use ($request) {
        return $request->assistanceRequest['requestType'] == "BREAKDOWN" or $request->assistanceRequest['requestType'] == "ERROR_CODE";
    }),
); 

$validator = Validator::make( $request->all(), $rules);

可以帮忙吗?解决这个问题的方法简单吗?

【问题讨论】:

    标签: laravel validation


    【解决方案1】:

    在您的 Rule::requiredIf(function (){}) 规则中,您使用了$request->assistanceRequest['source'] 变量并且错误显示source 键不存在于$request->assistanceRequest 数组中。

    方案一:使用??操作符:

    ...
        'vehicle.bodyLabel' => Rule::requiredIf(function () use ($request) {
            return $request->assistanceRequest['source'] ?? null == "ATD"; //example problem
        }),
    ...
    

    方案二:使用isset()函数:

    ...
        'vehicle.bodyLabel' => Rule::requiredIf(function () use ($request) {
            if(!isset($request->assistanceRequest['source'])) return false;
            return $request->assistanceRequest['source'] ?? null == "ATD"; //example problem
        }),
    ...
    

    解决方案 3:使用 request() 助手:

    ...
        'vehicle.bodyLabel' => Rule::requiredIf(function () use ($request) {
            return request('assistanceRequest.source', null) == "ATD"; //example problem
        }),
    ...
    

    请注意,您已在多个验证规则中使用它,您必须更改所有规则

    【讨论】:

      猜你喜欢
      • 2016-07-13
      • 2015-04-14
      • 2015-04-04
      • 2014-04-20
      • 2016-09-23
      • 2014-12-19
      • 1970-01-01
      • 2014-11-18
      • 2014-05-15
      相关资源
      最近更新 更多