php - Laravel 验证:规则 'validate_if'
问题描述
我有以下客户端发送的数据形状:
{
categories: [{
name: string;
fields: [{
type: string;
name: string;
rules: [{
from?: date|number;
to?: date|number;
label?: string;
value?: number;
rate: number;
}]
}]
}]
}
附加约束:
什么时候
categories[x]fields[x]type
== '数字'然后
categories[x]fields[x]rules.*.from
是必需的,并且必须验证为 NUMERICcategories[x]fields[x]rules.*.to
是必需的,并且必须验证为 NUMERIC什么时候
categories[x]fields[x]type
== '日期'然后
categories[x]fields[x]rules.*.from
是必需的,并且必须验证为 DATEcategories[x]fields[x]rules.*.to
是必需的,并且必须验证为 DATE
我在简单的情况下用谷歌搜索,建议这样做:
$rules = [ ... ];
if ($request->get('type') === 'cd') {
$rules['records.*.memory'] = 'max:700';
} else if ($request->get('type') === 'dvd') {
$rules['records.*.memory'] = 'max:4700';
}
但在我的情况下,我可以在fields
数组中有一些元素的类型为 == 'dates' 和一些'numbers',所以我无法使用 if-s 来管理它。
解决方案
据我了解,唯一可能的解决方案是分两步完成:
$this->validate($request, [
'categories' => 'required|array',
'categories.*.name' => 'required_without:categories.*.isGeneral|string|max:255',
'categories.*.fields' => 'required|array',
'categories.*.fields.*.name' => 'required|string',
'categories.*.fields.*.type' => 'required|in:numbers,dates',
'categories.*.fields.*.rules' => 'required|array',
]);
$dateFields = [];
$numberFields = [];
foreach ($request->post('categories') as $categoryIndex => $category) {
$dateFields[$categoryIndex] = ['fields' => []];
$numberFields[$categoryIndex] = ['fields' => []];
foreach ($category['fields'] as $fieldIndex => $field) {
if ($field['type'] === 'numbers') {
$numberFields[$categoryIndex]['fields'][$fieldIndex] = $field;
} else if ($field['type'] === 'dates') {
$dateFields[$categoryIndex]['fields'][$fieldIndex] = $field;
}
}
}
$dateFieldsValidator = $this->getValidationFactory()->make($dateFields, [
'*.fields.*.rules.*.from' => 'required|date',
'*.fields.*.rules.*.to' => 'required|date|gte:*.fields.*.rules.*.from',
'*.fields.*.rules.*.rate' => 'required|numeric|between:0,100',
]);
$numberFieldsValidator = $this->getValidationFactory()->make($numberFields, [
'*.fields.*.rules.*.from' => 'required|numeric',
'*.fields.*.rules.*.to' => 'required|numeric|gte:*.fields.*.rules.*.from',
'*.fields.*.rules.*.rate' => 'required|numeric|between:0,100',
]);
$errors = [];
if ($dateFieldsValidator->fails()) {
$errors = array_merge($errors, $dateFieldsValidator->errors()->getMessages());
}
if ($numberFieldsValidator->fails()) {
$errors = array_merge($errors, $numberFieldsValidator->errors()->getMessages());
}
推荐阅读
- c++ - async_read_until:缓冲区空间不足或队列已满
- python - 尝试在 Google Colab 中安装/使用 Python-Magic 时出错
- python - Spark REST API 发布请求不返回响应
- c# - 完全被难住了 - System.Runtime.InteropServices.ExternalException:“GDI+ 中发生了一般错误。”
- c++ - 在对象外部访问时,尝试从文件描述符读取到缓冲区失败
- c# - 如何从另一个 AppDomain 调用任意方法
- html - 如何使引导列仅以相等的倍数折叠?
- knime - 将 KNIME 工作流导出为独立应用程序或 JAR
- c# - GameObject 数组初始化的“索引超出数组范围”
- winapi - 为什么带有渐变填充的 RoundRect 路径不能在右侧产生正确的角?