首页 > 解决方案 > Laravel - 验证一个整数低于另一个属性中的元素数

问题描述

我正在为搜索端点编写验证代码,并尝试验证结果中应匹配的用户定义的关键字数量小于或等于请求中的关键字数量。
请求可能如下所示:

{
    "keywords": [
        "foo",
        "bar",
        "baz",
    ],
    "minimumShouldMatch": 2
}

这告诉服务器我们想要的结果应该至少匹配其中两个关键字(使用 Elasticsearch 的常见操作)。显然, 的值minimumShouldMatch必须小于关键字的数量:服务器匹配的数量不能超过我们提供的数量。

我们可以简单地省略对上限的验证,稍后将值标准化,然后就结束了:

$minimumShouldMatch = min(
    count($request->get('keywords')),
    $request->get('minimumShouldMatch')
);

然而,API 最终将被第三方开发人员使用,我想明确指出错误的输入值,以防止在它出现之前产生误解。

另一种可能的解决方案是创建一个新的自定义规则对象或闭包。但是,规则对象仅接收单个属性的名称和值,而不接收请求中的其他属性(请参阅文档)。按照这个答案,我们可以将请求属性传递给规则构造函数或使用外观:

class LowerThanOrEqualToNumberOfKeywords implements Rule {
    public function __construct(
        protected string $field,
        protected array $attributes,
    ) {}

    public function passes($attribute, $value): bool {
        return $value <= count($this->attributes($this->field));
        // or
        return $value <= count(Input::get($this->field));
    }
}

两者都是处理此问题的非惯用方式。

我还尝试将关键字属性的名称传递给低于规则 ( lt:keywords),但由于属性的类型不同(可能是正确的)而失败。

是否有一种直接的方法来验证整数属性是否小于(或等于)单独数组属性中的元素数?

标签: phplaravelvalidationlaravel-validation

解决方案


推荐阅读