【问题标题】:Validating array of relative arrays(maps) with Respect/Validation?使用尊重/验证验证相对数组(地图)的数组?
【发布时间】:2021-05-17 17:30:11
【问题描述】:

我正在尝试验证以下 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 版。 任何人都知道如何做到这一点,尊重/验证?(我已经知道如何手动做到这一点)。谢谢。

【问题讨论】:

  • 嗨!既然我看到了$this->validator->validate,您是否使用其他库/中间件进行此验证?
  • 我只是将验证器初始化为构造函数上的全局变量。

标签: php validation http respect-validation


【解决方案1】:

这里的问题是您的规则要求的 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
        }
    ]
}

您可以查看我的完整代码here

【讨论】:

  • 我复制/粘贴时出错了,即使我删除了它不起作用的密钥,请检查错误是否表明缺少更多密钥,而不仅仅是 product_image_id。您确定您的代码有效吗?
  • @FrancescArolas,是的,我认为这是预期的行为,因为 KeySet 是一组规则。您可以查看its implementationrelated exception
猜你喜欢
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 2015-10-24
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多