Laravel必填验证导致校验失败问题求助
问题
验证从JSON文件获取的数据时,移除required规则校验能通过,但添加该规则后就失败。确认所有待校验字段都不为空,却找不到问题所在,有没有明显遗漏的点?
控制器代码
// START: Validate request $validator = Validator::make($request->all(), [ 'results.*.status.*.name' => 'required|max:255', 'results.*.error.*.name' => 'required', 'results.*.messageId' => 'required', 'results.*.doneAt' => 'required|date', 'results.*.smsCount' => 'required|numeric', 'results.*.sentAt' => 'required', 'results.*.callbackData' => 'required', ]); // The "required" is causing the validation to fail if ($validator->fails()) { dd('fail'); } else { dd('pass'); } // END: Validate request
JSON数据
{ "results": [ { "bulkId": "BULK-ID-123-xyz", "price": { "pricePerMessage": 0.0185, "currency": "GBP" }, "status": { "id": 5, "groupId": 3, "groupName": "DELIVERED", "name": "DELIVERED_TO_HANDSET", "description": "Message delivered to handset" }, "error": { "id": 0, "name": "NO_ERROR", "description": "No Error", "groupId": 0, "groupName": "OK", "permanent": false }, "messageId": "MESSAGE_UUID", "doneAt": "2022-11-21T17:11:16.661+0000", "smsCount": 1, "sentAt": "2022-11-21T17:11:12.129+0000", "callbackData": "CAMPAIGN_ID", "to": "447572554668" } ] }
解决方案
问题出在验证规则的字段路径错误:
你写的results.*.status.*.name和results.*.error.*.name里,status和error是单个对象,不是数组,中间的*完全多余。这个*会让验证器去寻找status下的数组元素,但实际不存在,所以验证器判定name字段缺失,触发required规则失败。
把规则里的这两行改成下面这样就可以了:
'results.*.status.name' => 'required|max:255', 'results.*.error.name' => 'required',
之所以移除required能通过,是因为其他规则(比如max:255)在字段路径错误找不到值时,不会强制要求字段必须存在,而required会严格校验字段的存在性。
内容的提问来源于stack exchange,提问作者Nathan Bayne
相关产品推荐
相关产品推荐

