Return 如果验证器中未提及正文参数,则会出现错误响应

Return error response if a body params is not mentionned in the validator

我正在使用 Laravel Validator 来测试我的传入请求。所以为了确保请求包含一个 username 和一个 email,我写了这样的东西:

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

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

但是如果在我的请求中我有一个额外的参数,比如 name,验证器不会将其视为错误并且不会失败。

你知道如何让我的验证器更严格以便请求正文完全匹配吗?

从技术上讲,这不是验证器中的验证失败。但是您可以检查是否有额外的(意外的)字段,并根据需要发送 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);

希望对您有所帮助

验证规则只能附加到属性上,所以我认为 Laravel 的验证器无法做到这一点。但是您仍然可以通过向它们提供自定义 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
]);

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