php - 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
),但由于属性的类型不同(可能是正确的)而失败。
是否有一种直接的方法来验证整数属性是否小于(或等于)单独数组属性中的元素数?
解决方案
推荐阅读
- ruby-on-rails - Rails 在使用日期进行查询时更改了列大小写
- .net - 使用 WebClient 将文件上传到 Google Drive
- sql-server - 无法连接到 Azure SQL 数据库以创建实体数据模型
- python - 标签在饼图中的位置
- excel - Excel:如何提取多个文本
- swift - 尝试执行领域迁移时获取无效的属性名称
- regex - 获取 java.net.URISyntaxException:索引 7 处路径中的非法字符:http:/${Bearer}
- javascript - 传递给函数的 Firefox JavaScript 参数未定义
- postgresql - pg_upgrade 与 brew mac os 9.6.2 - 10.5
- r - 将带有 textInput 值的 searchTwitter 值传递给 get_nrc_sentiment