You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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”的规则),可以自定义验证规则:

  1. 创建自定义验证规则类:
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.';
    }
}
  1. 在控制器中使用这个自定义规则:
// 替换之前的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:25:45