我正在使用 Lumen 框架,它利用了 Laravel Validation 我想创建一个验证器规则,使 Request->input() json 仅在根目录中包含特定键,例如“domain”和“nameservers”。不多也不少。
传递规则的例子:
{
"domain":"domain.tld",
"nameservers":
{...}
}
不通过规则的例子:
{
"domain":"domain.tld",
"nameservers":
{...},
"Hack":"executeSomething()"
}
我尝试使用多个默认验证规则来实现这一点,但没有成功。 我的方法是现在将请求放在另一个数组中,如下所示 $checkInput['input'] = $request->all(); 使验证器验证“根” key 。
现在这是我的方法:
创建验证器
$checkInput['input'] = $request->all();
$validator = Validator::make($checkInput, [
'input' => [
'onlyContains:domain,nameservers'
],
]);
创建规则
Validator::extend('onlyContains', function($attribute, $value, $parameters, $validator){
$input = $validator->getData();
$ok = 0;
foreach ($parameters as $key => $value) {
if (Arr::has($input, $attribute . '.' . $value)) {
$ok++;
}
}
if (sizeof(Arr::get($input, $attribute)) - $ok > 0) {
return false;
}
return true;
});
看起来我得到了想要的结果,但我想问一下是否有更聪明的解决方案,使用 Laravel/Lumen 提供的默认规则。
最佳答案
您正在尝试使用黑名单方法来阻止不需要的字段。一种被广泛使用的简单方法是只取出经过验证的。此外,您正在尝试执行违反正常验证逻辑的逻辑,一次执行一个字段。
这也是了解 FormRequest
以及如何将逻辑放到更有意义的地方的好时机。
public function route(MyRequest $request) {
$input = $request->validated();
}
使用这种方法,您只会在 $input 变量中拥有经过验证的字段。作为额外的好处,这种方法将使您的代码更容易被其他 Laravel 开发人员使用。示例表单请求如下。
public class MyRequest extends FormRequest
{
public function rules()
{
return [
'domain' => ['required', 'string'],
'nameservers' => ['required', 'array'],
];
}
}
关于php - 创建规则使请求仅包含某些键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56990578/