php - Laravel Validation Array 必须包含一个 boolean 为 true 的项目
问题描述
我正在验证问题和答案(用于测试创建)。我想确保 answers 数组至少包含一个“正确”项目。那么在哪里answers.*.correct => true
。
我目前有以下内容:
public function rules()
{
return [
'title' => 'required|string|max:255',
'test_id' => 'required|integer|exists:tests,id',
'content' => 'required',
'answers' => 'required|array',
'answers.*.text' => 'required|string|max:255',
'answers.*.correct' => 'required|boolean'
];
}
目前我可能会错过添加一个正确答案,从而导致一个不可能的问题。
我检查了文档,看不到任何突出的东西。
任何帮助,将不胜感激。
编辑答案
我使用了这个(如答案所述):Laravel validate at at least one item in a form array
我设法创建了一个自定义规则,如下所示:
public function passes($attribute, $value)
{
foreach ($value as $arrayElement) {
if ($arrayElement['correct'] == true) {
return true;
}
}
return false;
}
然后在我在我创建的新规则中添加的请求的现有规则()部分中:
'answers' => ['required', 'array', new ArrayAtLeastOneBoolTrue()],
解决方案
您在这里验证数组答案是否具有:
- 一个最大的字符串。255 个字符(文本)
- 布尔值(正确)
要检查这个数组的完整性,Laravel 请求是检查错误的地方。从技术上讲,可以创建自己的验证规则,但在这里没有意义。相反,您应该在控制器中迭代此数组并验证每个答案的完整性。还有两个想法,要做得更好:
- 不要在一个数组中发送所有答案以及是否正确回答。相反,在用户单击它的那一刻,将选定的答案发送到您的 api,每个答案都有一个请求。这将 1. 防止有人向您发送他回答 100% 正确的信息(如果这是一个学校软件,那就不好了:))和 2. 根据有多少问题,它会将发送到服务器的数据减少到最低限度,主要是因为...
- ...似乎您将问题的整个文本发送到服务器以识别答案。每个问题使用一个唯一的 ID,并将其作为问题 ID + 选择或输入的答案发送。
编辑:感谢您的评论,对不起我的误解。如上所述,如果至少一个答案是正确的,那么自定义验证当然在这里检查每个问题是完全有意义的。看看这个:https ://stackoverflow.com/a/53791208/2264877
推荐阅读
- java - 在 Android 中使用 network-security-config 进行 SSL 固定
- git - Git分支策略:在git rebase期间:情侣文件不断冲突
- facebook - 如何获得 Facebook 开发者应用合同?
- javascript - 如何从标准 JS 访问 Vue 组件?
- python - 避免硬编码以获取 Python 文件路径
- list - 如何仅计算列表(PROLOG)中的数字元素,除了_?
- python - 密码python没有正确返回
- javascript - XMLhttprequest 得到 '404 not found' 但 invoke-webrequest 运行良好
- ubuntu - 带有 Bacula 的灾难恢复 Ubuntu 服务器
- internet-explorer - 如何以角度检索http 302响应