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

时间:2019-07-11 13:38:28

标签: php laravel validation lumen

我正在使用流明框架,该框架利用了Laravel Validation 我想创建一个验证器规则,以使Request-> input()json仅在根处包含“ domain”和“ nameservers”之类的特定键。不多也不少。

通过规则的示例:

{
    "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提供的默认规则的解决方案更聪明。

1 个答案:

答案 0 :(得分:0)

您正在尝试执行黑名单方法,以阻止不需要的字段。一种被广泛利用的简单方法是仅取出经过验证的方法。另外,您正在尝试执行与常规验证逻辑相反的逻辑,一次执行一个字段。

这也是学习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'], 
        ];
    }
}