【问题标题】:How to Customize ValidationException Response in Lumen?如何在 Lumen 中自定义 ValidationException 响应?
【发布时间】:2019-10-24 03:30:07
【问题描述】:

我使用 Lumen 开发了一个 REST API。我认为在 JSON 对象中使用 details 键很方便显示错误。查看回复:

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

Lumen 具有验证,您可以在控制器内部调用,如 $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 帮助程序将抛出 Illuminate\Validation\ValidationException 并嵌入包含所有相关错误消息的 JSON 响应。

这意味着我需要以某种方式扩展ValidationException,但我仍然不知道如何在$this->validate 方法中触发我的CustomValidationException。


环境

  • PHP 7.3.5
  • 流明 5.8

【问题讨论】:

    标签: php lumen


    【解决方案1】:

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

     $validator = Validator::make($request->all(), [
                'foo' => 'required'
            ]);
    
            if ($validator->fails()) {
                return response()->json(['details'=> $validator->errors()->first() ], 400);
            }
    

    400 这里是 json 响应。你可以用也可以不用

    【讨论】:

      【解决方案2】:

      在您的 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);
      }
      

      您仍然会收到翻译后的消息。在 Lumen 7.0 中测试。

      【讨论】:

        猜你喜欢
        • 2020-09-30
        • 2018-10-24
        • 2017-04-27
        • 2016-01-04
        • 2022-11-21
        • 2023-02-17
        • 1970-01-01
        • 2019-03-06
        • 2017-06-19
        相关资源
        最近更新 更多