我有一个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_tag,bt和bz_gsm字段是空值。如果删除time_tag验证规则,time_tag则不再为null(而是bt和bz_gsm为null)。与bt和bz_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)
然后fails是false(即,验证通过)。如果I dd($imf->first()),则再次为time_tag,bt并且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作业中验证数据是否有一些隐藏的技巧?
你可以在你看到dd()的是你传递什么验证是stdObjects的数组(这是默认json_decode()它看到时{})。但是,'*.blah'验证器的表示法实际上是用于验证数组的数组。显然,您发现将对象或数组传递给它时会遇到奇怪的行为。
简单的解决方法是通过一第二个参数的true到json_decode(),这将所述对象转换为关联数组,使得校验器能够正确地解析。
$imf = collect(json_decode($request->getBody()->__toString(), true));
Run Code Online (Sandbox Code Playgroud)
注意:这也会改变$imf您所拥有的结构;验证后您对其进行的任何处理都必须进行适当调整。
| 归档时间: |
|
| 查看次数: |
196 次 |
| 最近记录: |