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

标签 php laravel validation lumen

我正在使用 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/

相关文章:

javascript - 如何检查模态中的表单是否有效

php - 这个查询是否容易受到 sql 注入(inject)的攻击?

php - 网站上的 JPF,如何让它正常工作?

php - 库存管理软件 - php MySQL

mysql - Laravel 迁移无法创建关系

javascript - 使用在动态表单字段中选择的 jQuery

php - mysql inner join语句和内存过度使用!

php - 使用 Laravel Passport 注册用户

ios - 从那里的 -568h 启动验证 iOS 应用程序失败

javascript - 带有用户输入和验证的垂直条形图