0

我正在尝试验证以下 json:

{
    "variants": [
        {
            "variant_code": "1",
            "price": 12,
            "discount": 12,
            "height": 1,
            "longitude": 1,
            "width": 1,
            "weight": 1,
            "package_height": 1,
            "package_longitude": 1,
            "package_width": 1,
            "package_weight": 11,
            "stock": 1
        },
        {
            "variant_code": "2",
            "price": 12,
            "discount": 12,
            "height": 1,
            "longitude": 1,
            "width": 1,
            "weight": 1,
            "package_height": 1,
            "package_longitude": 1,
            "package_width": 1,
            "package_weight": 11,
            "stock": 1
        },
        {
            "variant_code": "3",
            "price": 12,
            "discount": 12,
            "height": 1,
            "longitude": 1,
            "width": 1,
            "weight": 1,
            "package_height": 1,
            "package_longitude": 1,
            "package_width": 1,
            "package_weight": 11,
            "stock": 1
        }
    ]
}

我找不到验证它的方法,我尝试了以下方法:

$this->validator->validate(
            $request, [
                        "variants" => v::arrayVal()->each(
                            v::key("variant_code", v::stringVal()->notEmpty()->length(1, 100)),
                            v::key("stock", v::intVal()->notOptional()),
                            v::key("price", v::numericVal()->notEmpty()),
                            v::key("discount", v::numericVal()->notEmpty()),
                            v::key("weight", v::numericVal()->notEmpty()),
                            v::key("width", v::numericVal()->notEmpty()),
                            v::key("height", v::numericVal()->notEmpty()),
                            v::key("longitude", v::numericVal()->notEmpty()),
                            v::key("package_weight", v::numericVal()->notEmpty()),
                            v::key("package_width", v::numericVal()->notEmpty()),
                            v::key("package_longitude", v::numericVal()->notEmpty()),
                            v::key("package_height", v::numericVal()->notEmpty())
                        )
                    ]
        );

但它只是验证每个相关数组的第一个键“variant_code”。我也试过这个:

$this->validator->validate(
            $request, [
                        "variants" => v::arrayVal()->each(
                            v::keySet(
                                v::key("variant_code", v::stringVal()->notEmpty()->length(1, 100)),
                                v::key("stock", v::intVal()->notOptional()),
                                v::key("price", v::numericVal()->notEmpty()),
                                v::key("discount", v::numericVal()->notEmpty()),
                                v::key("weight", v::numericVal()->notEmpty()),
                                v::key("width", v::numericVal()->notEmpty()),
                                v::key("height", v::numericVal()->notEmpty()),
                                v::key("longitude", v::numericVal()->notEmpty()),
                                v::key("package_weight", v::numericVal()->notEmpty()),
                                v::key("package_width", v::numericVal()->notEmpty()),
                                v::key("package_longitude", v::numericVal()->notEmpty()),
                                v::key("package_height", v::numericVal()->notEmpty())
                            )
                        )
                    ]
        );

但它会引发以下错误:

{
        "variants": {
            "variants": "Must have keys `{ \"variant_code\", \"stock\", \"price\", \"discount\", ... }`"
        }

我也尝试了许多其他方法,但均未成功。我正在使用 Respect/Validation 2.0 版和 PHP 7.4 版。任何人都知道如何做到这一点,尊重/验证?(我已经知道如何手动做到这一点)。谢谢你。

4

1 回答 1

0

这里的问题是product_image_id您的规则所需的密钥,但它不存在于您尝试验证的数据中。

我尝试了什么:

$string = file_get_contents(__DIR__ . "./data.json");
$json = json_decode($string, true);

function validate($data) {
    v::arrayVal()->each(
        v::keySet(
            v::key("variant_code", v::stringVal()->notEmpty()->length(1, 100)),
            v::key("product_image_id", v::optional(v::intVal())), // This key is missing in the data.json file
            v::key("stock", v::intVal()->notOptional()),
            v::key("price", v::numericVal()->notEmpty()),
            v::key("discount", v::numericVal()->notEmpty()),
            v::key("weight", v::numericVal()->notEmpty()),
            v::key("width", v::numericVal()->notEmpty()),
            v::key("height", v::numericVal()->notEmpty()),
            v::key("longitude", v::numericVal()->notEmpty()),
            v::key("package_weight", v::numericVal()->notEmpty()),
            v::key("package_width", v::numericVal()->notEmpty()),
            v::key("package_longitude", v::numericVal()->notEmpty()),
            v::key("package_height", v::numericVal()->notEmpty())
        )
    )->assert($data);
}

try {
    /*
    $array = [
        [
            "variant_code" => "qwerty"
        ]
    ];
    $result = validate($array);
    */

    validate($json["variants"]);
    echo ("Validation ok");
} catch(NestedValidationException $exception) {
    echo($exception->getFullMessage());
    echo ("Validation error");
}

data.json文件:

{
    "variants": [
        {
            "variant_code": "1",
            "price": 12,
            "discount": 12,
            "height": 1,
            "longitude": 1,
            "width": 1,
            "weight": 1,
            "package_height": 1,
            "package_longitude": 1,
            "package_width": 1,
            "package_weight": 11,
            "stock": 1
        },
        {
            "variant_code": "2",
            "price": 12,
            "discount": 12,
            "height": 1,
            "longitude": 1,
            "width": 1,
            "weight": 1,
            "package_height": 1,
            "package_longitude": 1,
            "package_width": 1,
            "package_weight": 11,
            "stock": 1
        },
        {
            "variant_code": "3",
            "price": 12,
            "discount": 12,
            "height": 1,
            "longitude": 1,
            "width": 1,
            "weight": 1,
            "package_height": 1,
            "package_longitude": 1,
            "package_width": 1,
            "package_weight": 11,
            "stock": 1
        }
    ]
}

你可以在这里查看我的完整代码。

于 2021-05-16T17:34:52.263 回答