gpt4 book ai didi

php - Laravel 验证会覆盖我的值吗?

转载 作者:行者123 更新时间:2023-12-03 18:52:53 25 4
gpt4 key购买 nike

我有一个 Laravel 5.8(也用 Laravel 6.1.0 测试过)作业,它定期从 NOAA Spacer Weather Prediction Centre 下载文件.作为工作的一部分,我想在将某些属性插入数据库之前验证它们,如果事情不正确,则使工作失败。

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)
}]

我工作的主要部分如下所示:


$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());



根据 the documentation , 调用 validate()在手动创建的验证器上的行为应该与验证请求对象的行为相同(即:“如果验证失败,用户将自动被重定向,或者在 AJAX 请求的情况下,将返回 JSON 响应”)

但是使用上面的代码,验证通过,但是 time_tag , btbz_gsm字段为空。如果我删除 time_tag验证规则, time_tag不再为空(但 btbz_gsm 为空)。与 bt 相同和 bz_gsm字段。基本上任何经过验证的字段都会被清空。

如果我将验证码更改为:

  $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());

然后 failsfalse (即验证通过)。如果我 dd($imf->first()) ,然后再次 time_tag , btbz_gsm为空,而 $imf 中的所有其他元素是原始值。

据我所知,我的匹配是正确的,因为 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

dd($imf->all())验证后给我:

array:2032 [
0 => {#922
+"time_tag": null
+"active": true
+"source": "ACE"
+"range": null
+"scale": null
+"sensitivity": null
+"manual_mode": false
+"sample_size": 60
+"bt": null
+"bx_gse": -3.16
+"by_gse": 0.94
+"bz_gse": 1.2
+"theta_gse": 20.01
+"phi_gse": 163.43
+"bx_gsm": -3.15
+"by_gsm": 1.2
+"bz_gsm": null
+"theta_gsm": 15.69
+"phi_gsm": 159.09
+"max_telemetry_flag": 0
+"max_data_flag": 0
+"overall_quality": 0
}
// ... a few thousand more lines of output here

所以它找到了它需要的 key ,只是覆盖了那些,同时留下了其余的信息。

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

最佳答案

您可以在 dd() 中查看你传递给验证器的是一个 stdObjects 数组(当它看到 json_decode() 时,它是 {} 的默认值)。但是,'*.blah'验证器的符号实际上是用于验证数组的数组。显然,您发现在传递对象或数组时会出现奇怪的行为。

简单的解决方法是传递 second argumenttruejson_decode() ,这会将对象转换为关联数组,以便验证器可以正确解析它们。

$imf = collect(json_decode($request->getBody()->__toString(), true));

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

关于php - Laravel 验证会覆盖我的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58203388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com