Laravel验证会覆盖我的价值观吗?

Gra*_*yda 4 php laravel

我有一个Laravel 5.8(也已通过Laravel 6.1.0测试)作业,该作业会定期从NOAA间隔器天气预报中心下载文件。作为工作的一部分,我想先验证一些属性,然后再将它们插入数据库,如果情况不对,则使工作失败。

SWPC文件是一个JSON文件,其中包含如下所示的对象数组:

  [{
    time_tag: "2019-10-02T13:39:00",
    bt: 4.45,
    bz_gsm: 0.09,
    // (there are lots of other, irrelevant fields here)
  }, {
    // (more of the same data here, repeated dozens of times)
  }]
Run Code Online (Sandbox Code Playgroud)

我工作的主要部分是这样的:

  [{
    time_tag: "2019-10-02T13:39:00",
    bt: 4.45,
    bz_gsm: 0.09,
    // (there are lots of other, irrelevant fields here)
  }, {
    // (more of the same data here, repeated dozens of times)
  }]
Run Code Online (Sandbox Code Playgroud)

根据文档,调用validate()手动创建的Validator的行为应与验证请求对象的行为相同(即:“如果验证失败,则用户将自动重定向,如果是AJAX请求,则将返回JSON响应)将返回”)

然而与上面的代码,验证通过,但是time_tagbtbz_gsm字段是空值。如果删除time_tag验证规则,time_tag则不再为null(而是btbz_gsm为null)。与btbz_gsm字段相同。基本上任何要验证的字段都为空。

如果我将验证代码更改为此:


  $request = $guzzle->request('GET', 'https://services.swpc.noaa.gov/json/rtsw/rtsw_mag_1m.json');
  $imf = collect(json_decode($request->getBody()->__toString()));

  Validator::make($imf->all(), [
    '*.time_tag' => 'required|date', // Must be a valid date
    '*.bt' => 'required', // Bt must be present
    '*.bz_gsm' => 'required', // Bz must be present
  ])->validate();

  dd($imf->first());


Run Code Online (Sandbox Code Playgroud)

然后failsfalse(即,验证通过)。如果I dd($imf->first()),则再次为time_tagbt并且bz_gsm为null,而其中的所有其他元素$imf均为原始值。

据我所知,我的匹配是正确的,因为dd($imf->all())在此之前,它提供了很多如下所示的输出:

  $validator = Validator::make($imf->all(), [
    '*.time_tag' => 'required|date', 
    '*.bt' => 'required|file', // Bt is not an uploaded file! Validation should fail.
    '*.bz_gsm' => 'required',
  ]);

  dd($validator->fails());
Run Code Online (Sandbox Code Playgroud)

dd($imf->all())确认给我后:

array:2031 [
  0 => {#922
    +"time_tag": "2019-10-02T23:55:00"
    +"active": true
    +"source": "ACE"
    +"range": null
    +"scale": null
    +"sensitivity": null
    +"manual_mode": false
    +"sample_size": 60
    +"bt": 3.48
    +"bx_gse": -3.13
    +"by_gse": 0.58
    +"bz_gse": 1.4
    +"theta_gse": 23.73
    +"phi_gse": 169.57
    +"bx_gsm": -3.13
    +"by_gsm": 0.9
    +"bz_gsm": 1.23
    +"theta_gsm": 20.65
    +"phi_gsm": 164.0
    +"max_telemetry_flag": 0
    +"max_data_flag": 0
    +"overall_quality": 0
  }
// ... a few thousand more lines of output here
Run Code Online (Sandbox Code Playgroud)

因此,它会找到所需的密钥,并在保留其余信息的同时覆盖这些密钥。

在验证数据数组或在Laravel作业中验证数据是否有一些隐藏的技巧?

wun*_*nch 7

你可以在你看到dd()的是你传递什么验证是stdObjects的数组(这是默认json_decode()它看到时{})。但是,'*.blah'验证器的表示法实际上是用于验证数组的数组。显然,您发现将对象或数组传递给它时会遇到奇怪的行为。

简单的解决方法是通过一第二个参数truejson_decode(),这将所述对象转换为关联数组,使得校验器能够正确地解析。

$imf = collect(json_decode($request->getBody()->__toString(), true));
Run Code Online (Sandbox Code Playgroud)

注意:这也会改变$imf您所拥有的结构;验证后您对其进行的任何处理都必须进行适当调整。