如果验证器中未提及body参数,则返回错误响应

问题描述 投票:0回答:2

我正在使用Laravel Validator测试我的传入请求。因此,为确保该请求包含一个username和一个email,我编写如下内容:

$validator = Validator::make($request->all(), [
    'username'  => 'required',
    'email'     => 'required|email'
]);

if ($validator->fails()) {
    return response()->json('error', 400);
};

但是如果在我的请求中我有诸如name之类的附加参数,验证器将不会将其视为错误并且不会失败。

您有一个想法,我可以如何使我的验证器更加严格,以便请求主体完全匹配?

php laravel lumen
2个回答
3
投票

从技术上讲,这不是验证程序中的验证失败。但是您可以检查是否还有其他(意外)字段,并根据需要发送基于此的JSON响应。

也许是这样?

$validationRules = [
    'username'  => 'required',
    'email'     => 'required|email'
];

$validator = Validator::make($request->all(), $validationRules);

// Check if there are extra (unexpected) fields and fail in that case
$extraFields = $request->except(array_keys($validationRules));
if (count($extraFields) > 0) {
    return response()->json('error because there are extra fields', 400);
}

if ($validator->fails()) {
    return response()->json('error', 400);
}

return response()->json('ok', 200);

我希望它能为您提供帮助。


0
投票

验证规则只能附加到属性,所以我认为Laravel的Validator无法做到这一点。但是您仍然可以通过向它们提供自定义closure rule来明确禁止某些字段,如下所示:

$denied = function($attr, $value, $fail) {
    $fail("{$attr} is denied.");
};

$validator = Validator::make($request->all(), [
    'username'  => 'required',
    'email'     => 'required|email',
    'name'      => $denied,
    'password'  => $denied
]);

否则,您需要实现自定义验证逻辑,可能利用验证器中的规则数组作为白名单。

© www.soinside.com 2019 - 2024. All rights reserved.