【问题标题】:Create rule to make request only contain certain keys创建规则以使请求仅包含某些键
【发布时间】:2019-11-21 06:05:56
【问题描述】:

我正在使用 Lumen 框架,它利用 Laravel Validation 我想创建一个验证器规则,以使 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 提供的默认规则。

【问题讨论】:

  • 我认为扩展验证器可能是最简洁的方法。我不知道验证器中有什么标准可以满足您的要求。总而言之,您似乎选择了最好的方法。

标签: php laravel validation lumen


【解决方案1】:

您正在尝试使用黑名单方法来屏蔽不想要的字段。一种被大量使用的简单方法是只提取经过验证的内容。此外,您正在尝试执行与正常验证逻辑背道而驰的逻辑,一次执行一个字段。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-26
    • 2023-04-03
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    相关资源
    最近更新 更多