Laravel Array:Key 验证
Laravel Array:Key Validation
我的 Laravel 后端收到一个 JSON 转换的 Javascript 数组并将其解码为以下 php 数组:
dd($cart) 已编辑密钥已更改
array:4 [▼
"personcount" => 2
"person1" => array:2 [▼
"Customer" => array:2 [▶]
"Items" => array:5 [▼
"key1" => 0
"key2" => 0
"key3" => 0
"key4" => 0
"key5" => 1
]
]
"person2" => array:2 [▼
"Customer" => array:2 [▶]
"Items" => array:5 [▶]
]
]
我创建了一个过滤器中间件,它应该验证给定的数组并在失败的情况下重定向回来。
Filter.php 已编辑添加了新的(无效的)验证规则方法
$cart = json_decode($request->input('cart'), true);
$validation_rules = [];
$TotalItemCount = 0;
for ($i = 1; $i <= $person_count; $i++) {
foreach ($cart[$i]["Items"] as $Item => $ItemCount) {
$TotalItemCount += $ItemCount;
}
$validation_rules += [
"person$i.Customer.FirstName" => "required|string|min:2|max:255",
"person$i.Customer.LastName" => "required|string|min:2|max:255",
"person$i.Items.*" => "required|numeric",
"person$i.Items" => ['required', 'array',
Rule::in(["Key1", "Items"]),
],
];
}
$validated_input = Validator::make($cart, $validation_rules);
验证器似乎忽略了 $i.Items 验证规则。
我什至将 size:5 更改为 size:6,这不得不 100% 触发错误,因为给定的项目数组总是只包含 5 个元素。
此外,我尝试验证数组键:
"$i.Items" => "required|array:key1,key2,key3"
它也根本没有开火。我想要所有的钥匙。
firstName/Lastname 规则适用。
我很乐意提出建议。
而不是
"required|array:key1,key2,key3"
你会做类似的事情
'required|in:' . $this->array() . ''
经过大量研究和努力,我找到了解决方案:
对于在 Laravel 8+ 中拼命搜索高级数组验证示例的每个人:
- Step: ALWAYS use an array, not an object.
For that purpose:
public function fCreateArrayFromObject($Object) {
$toArray = function ($x) use (&$toArray) {
return is_scalar($x)
? $x
: array_map($toArray, (array)$x);
};
return $toArray($Object);
}
- Step: I will use my example to show you how its easily done:
My array ($cart):
array:3 [▼
"user1" => array:2 [▼
"Items" => array:5 [▼
"blue" => 0
"grey" => 1
"brown" => 1
"look" => 0
"black" => 0
]
"User" => array:2 [▼
"LastName" => "alice"
"FirstName" => "Bobby"
]
]
"user2" => ......
]
My rules:
$person_count = 2; // Up to 5
$validation_rules = [];
for ($i = 1; $i <= $person_count; $i++) {
$validation_rules += [
"user$i" => "array:Items,Customer|size:2|distinct",
"user$i.user.FirstName" => "required|string|min:2|max:255",
"user$i.user.LastName" => "required|string|min:2|max:255",
"user$i.Items.*" => "required|numeric|min:0",
"user$i.Items" => "required|array:blue,grey,brown,look,black|size:5|distinct",
];
}
Action:
$validated_input = Validator::make((array)$cart, $validation_rules);
我不太确定,为什么 make 方法不能将没有 (array) 的 $cart 数组解释为数组,但它可以工作。
目标:
- 验证整个购物车:必须将每个人包含为一个恰好包含 2 个元素的数组(最多五个人数组)works
- 验证每个人本身:必须包含用户和项目数组 works
- 验证用户数组:必须包含 2 到 255 个字符的名字和姓氏,每个字符都是字符串 works
- 验证 Items 数组:必须完全是 size:5,必须包含所有给定的键 works
- 验证 Items 数组的键值:它们必须是数字并且至少为 0 works
显然一切都必须存在:“必需”
标签:Laravel 数组验证,Laravel 嵌套数组验证
我的 Laravel 后端收到一个 JSON 转换的 Javascript 数组并将其解码为以下 php 数组:
dd($cart) 已编辑密钥已更改
array:4 [▼
"personcount" => 2
"person1" => array:2 [▼
"Customer" => array:2 [▶]
"Items" => array:5 [▼
"key1" => 0
"key2" => 0
"key3" => 0
"key4" => 0
"key5" => 1
]
]
"person2" => array:2 [▼
"Customer" => array:2 [▶]
"Items" => array:5 [▶]
]
]
我创建了一个过滤器中间件,它应该验证给定的数组并在失败的情况下重定向回来。
Filter.php 已编辑添加了新的(无效的)验证规则方法
$cart = json_decode($request->input('cart'), true);
$validation_rules = [];
$TotalItemCount = 0;
for ($i = 1; $i <= $person_count; $i++) {
foreach ($cart[$i]["Items"] as $Item => $ItemCount) {
$TotalItemCount += $ItemCount;
}
$validation_rules += [
"person$i.Customer.FirstName" => "required|string|min:2|max:255",
"person$i.Customer.LastName" => "required|string|min:2|max:255",
"person$i.Items.*" => "required|numeric",
"person$i.Items" => ['required', 'array',
Rule::in(["Key1", "Items"]),
],
];
}
$validated_input = Validator::make($cart, $validation_rules);
验证器似乎忽略了 $i.Items 验证规则。 我什至将 size:5 更改为 size:6,这不得不 100% 触发错误,因为给定的项目数组总是只包含 5 个元素。
此外,我尝试验证数组键:
"$i.Items" => "required|array:key1,key2,key3"
它也根本没有开火。我想要所有的钥匙。 firstName/Lastname 规则适用。
我很乐意提出建议。
而不是
"required|array:key1,key2,key3"
你会做类似的事情
'required|in:' . $this->array() . ''
经过大量研究和努力,我找到了解决方案:
对于在 Laravel 8+ 中拼命搜索高级数组验证示例的每个人:
- Step: ALWAYS use an array, not an object. For that purpose:
public function fCreateArrayFromObject($Object) {
$toArray = function ($x) use (&$toArray) {
return is_scalar($x)
? $x
: array_map($toArray, (array)$x);
};
return $toArray($Object);
}
- Step: I will use my example to show you how its easily done:
My array ($cart):
array:3 [▼
"user1" => array:2 [▼
"Items" => array:5 [▼
"blue" => 0
"grey" => 1
"brown" => 1
"look" => 0
"black" => 0
]
"User" => array:2 [▼
"LastName" => "alice"
"FirstName" => "Bobby"
]
]
"user2" => ......
]
My rules:
$person_count = 2; // Up to 5
$validation_rules = [];
for ($i = 1; $i <= $person_count; $i++) {
$validation_rules += [
"user$i" => "array:Items,Customer|size:2|distinct",
"user$i.user.FirstName" => "required|string|min:2|max:255",
"user$i.user.LastName" => "required|string|min:2|max:255",
"user$i.Items.*" => "required|numeric|min:0",
"user$i.Items" => "required|array:blue,grey,brown,look,black|size:5|distinct",
];
}
Action:
$validated_input = Validator::make((array)$cart, $validation_rules);
我不太确定,为什么 make 方法不能将没有 (array) 的 $cart 数组解释为数组,但它可以工作。 目标:
- 验证整个购物车:必须将每个人包含为一个恰好包含 2 个元素的数组(最多五个人数组)works
- 验证每个人本身:必须包含用户和项目数组 works
- 验证用户数组:必须包含 2 到 255 个字符的名字和姓氏,每个字符都是字符串 works
- 验证 Items 数组:必须完全是 size:5,必须包含所有给定的键 works
- 验证 Items 数组的键值:它们必须是数字并且至少为 0 works
显然一切都必须存在:“必需”
标签:Laravel 数组验证,Laravel 嵌套数组验证