0

我正在使用尊重验证来尝试验证通过 POST 请求发送的数据。在这样做的过程中,我发现了一个问题,即 Respect Validation 库中的异常没有被捕获。

$postValidator = v::key('name', v::stringType()->length(3, 50))
                 ->key('email', v::email())
                 ->key('contact', v::phone())
                 ->key('message', v::stringType()->length(7, 1000));

try {
    $isValid = $postValidator->assert(['random' => 'thing']);
} catch(Exception $exception) {
    return $response->withJson([
        'success' => false
    ]);
}

测试以下内容会返回以下错误:

All of the required rules must pass for { "random": "thing" }

在这里,我使用了一个泛型Exception,它应该捕获方法中发生的任何异常assert。但它似乎没有,我得到一个通用的 Slim 错误,而不是 JSON 响应:

在此处输入图像描述

任何想法为什么我不能捕捉到那个异常?

我遇到的问题是,如果顽皮的用户要输入应用程序无法处理的 postdata,Respect Validation 将引发异常。就个人而言,我宁愿尊重验证只是忽略那些,但事实并非如此。所以我想捕捉当用户传递未定义的帖子数据并返回响应时 Respect 抛出的异常。除了,在上面的代码中,异常没有被捕获。

4

1 回答 1

0

我知道这个问题很老,但我遇到了同样的问题,这就是我解决它的方法。我希望有人会觉得有帮助。对我来说,它的工作原理如下,

$input = [ 
    'title' => 1
    'description' => "Validator test"
    'author' => "nipuna"
];

$postValidator = Valid::key('title',Valid::length(2,30)->stringType())
                    ->key('description',Valid::stringType())
                    ->key('author',Valid::intType()->length(1,2))
                    ->key('user',Valid::intType()->length(1,2));
try {
    $isValid = $postValidator->assert($input);
    // Do something with it
} catch (NestedValidationException $e) {
    http_response_code(400);
    echo json_encode([
        'error' => $e->getMessages()
    ]);
}

结果是,

{
    "error": {
        "title": "title must be of type string",
        "author": "author must have a length between 1 and 2",
        "user": "user must be present"
    }
}

我所做的唯一改变是,改变我在 catch 中得到错误的方式。您也可以通过Exception在 catch 中使用来捕获异常,因为扩展异常会退回到原生 PHP 异常。但是getMessages()是一部分NestedValidationException。因此,在捕获中使用它是合适的。

所以在你的情况下,因为你的数组中没有匹配的键,它应该显示{{key}} must be present

于 2022-01-15T08:18:51.887 回答