创建规则以使请求仅包含某些键



我正在使用Lumen Framework,它利用了Laravel验证我想创建一个验证器规则,使 Request->input(( json 仅包含根目录中的特定键,如"域"和"名称服务器"。不多也不少。

传递规则的示例:

{
    "domain":"domain.tld",
    "nameservers":
        {...}
}

未传递规则的示例:

{
    "domain":"domain.tld",
    "nameservers":
        {...},
    "Hack":"executeSomething()"
}

我尝试使用几个默认验证规则来实现这一点,但没有成功。我现在的方法是将请求放在另一个数组中,如下所示 $checkInput['input'] = $request->all((;使验证器验证"根"密钥。

现在这是我的方法:

创建验证人

        $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'], 
        ];
    }
}

您应该使用禁止的规则。例如:

$allowedKeys = ['domain', 'nameservers'];
$inputData =  $request->all();
$inputKeys = array_keys($inputData);
$diffKeys = array_diff($inputKeys, $allowedKeys);
$rules = [];
foreach($diffKeys as $value) {
    $rules[$value] = ['prohibited'];
}

相关内容

最新更新