如何在流明中自定义ValidationException响应?

时间:2019-06-09 11:59:04

标签: php lumen

我使用Lumen开发了REST API。我认为在JSON对象中使用details键很容易显示错误。查看响应:

{"detail": "Something bad happened."}

流明具有可以像$this->validate(["foo" => "required", "bar" => "required"})一样在控制器内部调用的验证。如果我未在请求正文中设置foo值,则服务器自然会响应:

{
    "foo": [
        "The foo field is required."
    ]
}

但是,我也希望它们位于details键内,以便为消费者提供方便。查看所需的回复:

{
    "details": {
        "foo": [
            "The foo field is required."
        ]
    }
}

是否可以执行此操作?

进一步调查

Validation section in Lumen documentation所述:

  

如果验证失败,则$ this-> validate帮助器<​​strong>将抛出带有包含所有相关错误消息的嵌入式JSON响应的Illuminate \ Validation \ ValidationException 。

这意味着我需要扩展ValidationException,但我仍然不知道如何使用CustomValidationException方法触发$this->validate


环境

  • PHP 7.3.5
  • 流明5.8

2 个答案:

答案 0 :(得分:1)

您可以将$ this-> validate()的结果分配给一个变量,并根据您的选择在json响应中使用该变量。 如下所示:

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

        if ($validator->fails()) {
            return response()->json(['details'=> $validator->errors()->first() ], 400);
        }

400这是json响应。您可以使用它

答案 1 :(得分:0)

在您的 App / Exception / Handler 类中,添加以下行:

use Illuminate\Validation\ValidationException;

...

public function render($request, Throwable $exception) {
    ...

    if ($exception instanceof ValidationException) {
        return response()->json([
                    'details' => $exception->errors(),
        ], 422);
    }


    return parent::render($request, $exception);
}

您仍然会收到翻译后的消息。在流明7.0中进行了测试。