Laravel 8.X中对含特定字符串属性的JSON验证方案问询
解决方案
当然可以实现!Laravel的验证系统足够灵活,能完美处理这种动态命名的字段。核心思路是先筛选出所有以item:开头的请求参数,再为它们动态生成验证规则,最后和固定字段(比如picking_method、地址信息)的规则合并验证。
基础实现:验证JSON格式
首先,在你的控制器方法里,先收集所有符合item:xxx格式的字段,然后为它们添加json验证规则,再和其他固定字段的规则合并:
public function saveGroceryList(Request $request) { // 1. 筛选出所有以item:开头的请求字段 $itemFields = $request->collect() ->filter(fn($value, $key) => str_starts_with($key, 'item:')) ->keys(); // 2. 为每个item字段生成JSON验证规则(这里加了required,确保提交的item都有效) $itemValidationRules = array_fill_keys($itemFields, ['required', 'json']); // 3. 定义固定字段的验证规则 $fixedRules = [ 'picking_method' => 'required|string|in:delivery,in_store', 'address_line1' => 'required|string', 'city' => 'required|string', 'postal_code' => 'required|string', // 其他地址相关字段的规则... ]; // 4. 合并所有规则并执行验证 $validatedData = $request->validate(array_merge($fixedRules, $itemValidationRules)); // 后续处理逻辑:解析每个item的JSON字符串、保存到数据库等 foreach ($itemFields as $field) { $itemData = json_decode($validatedData[$field], true); // 处理商品数据... } }
进阶:验证JSON内容结构
如果需要进一步验证每个商品JSON的具体内容(比如必须包含id、name、quantity字段,且ID符合“新增用负整数、现有用数据库正ID”的规则),可以自定义验证规则:
- 创建自定义验证规则类:
namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class ValidGroceryItem implements Rule { public function passes($attribute, $value) { // 先验证是否为有效的JSON $item = json_decode($value, true); if (json_last_error() !== JSON_ERROR_NONE) { return false; } // 验证必填字段是否存在 if (!isset($item['id'], $item['name'], $item['quantity'])) { return false; } // 验证ID规则:新增商品为负整数,现有商品为正整数 $isValidId = is_int($item['id']) && (($item['id'] < 0) || ($item['id'] > 0)); // 验证数量为正整数 $isValidQuantity = is_int($item['quantity']) && $item['quantity'] > 0; return $isValidId && $isValidQuantity && is_string($item['name']); } public function message() { return 'The :attribute must be a valid grocery item JSON with a valid ID, name, and positive quantity.'; } }
- 在控制器中使用这个自定义规则:
// 替换之前的itemValidationRules定义 use App\Rules\ValidGroceryItem; $itemValidationRules = array_fill_keys($itemFields, ['required', new ValidGroceryItem()]);
补充说明
- 这种方法完全适配你“商品数量1-10个不等”的需求:不管提交1个还是10个
item:xxx字段,都会被自动筛选并验证。 - 如果允许提交0个商品,只需把
required规则去掉,或者添加额外逻辑判断count($itemFields)是否在0-10之间。
内容的提问来源于stack exchange,提问作者BT_Code
相关产品推荐
相关产品推荐

