捕获App\Http\Requests验证类抛出的异常

异常捕获

php 版本 :7.4.49
laravel版本 Laravel Framework :8.60.0

创建验证类

php artisan make:request TestPost

# 规则如下
return [
    'id' => 'required',
    'platform' => 'required|in:1001,1002,1003,1004,1005,1007',
];

控制器中

public function collect(TestPost $request){
    $request->validated();
}

使用postman请求,参数为 id:123,platform:100

{
    "message": "The given data was invalid.",
    "errors": {
        "platform": [
            "The selected platform is invalid."
        ]
    },
    "status_code": 422
}

想要自定义返回的内容

{
   code:1,
   msg:'The given data was invalid',
   data:null
}

查看资料说在App\Exceptions\Handler类中 重写 render()即可,经测试无效

public function render($request, Throwable $e)
{
    if ($e instanceof ValidationException) {
        return response(['code' => 1, 'msg' => 'test msg', 'data' => null]);
    }

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

应该如何自定义相应返回的内容呢?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案
public function authorize()
    {
        return true;
    }
public function rules()
{
  return [
     'id' => 'required',
  ];
}
public function messages()
{
  return [
     'id.required' => '...',
  ];
}
public function failedValidation(Validator $validator) {
     throw(new HttpResponseException(response()->json([
            'code'=>422,
            'msg'=>$validator->errors()->first(),
            'data'=>null
        ],422)));
}
protected function failedAuthorization()
    {
        throw(new HttpResponseException(response()->json([
            'code'=>403,
            'msg'=>'您没有权限进行此操作。',
            'data'=>null
        ],403)));
    }
2年前 评论
magein (楼主) 2年前
magein (楼主) 2年前
php_yt (作者) 2年前
讨论数量: 4
public function authorize()
    {
        return true;
    }
public function rules()
{
  return [
     'id' => 'required',
  ];
}
public function messages()
{
  return [
     'id.required' => '...',
  ];
}
public function failedValidation(Validator $validator) {
     throw(new HttpResponseException(response()->json([
            'code'=>422,
            'msg'=>$validator->errors()->first(),
            'data'=>null
        ],422)));
}
protected function failedAuthorization()
    {
        throw(new HttpResponseException(response()->json([
            'code'=>403,
            'msg'=>'您没有权限进行此操作。',
            'data'=>null
        ],403)));
    }
2年前 评论
magein (楼主) 2年前
magein (楼主) 2年前
php_yt (作者) 2年前

你抛出的是 ValidationException 吗?正常是可以的

 public function render($request, Throwable $e)
    {
        if ($e instanceof ValidationException) {
            return response(['code' => 1, 'msg' => 'test msg', 'data' => null]);
        }
        return parent::render($request, $e);
    }

file

2年前 评论
magein (楼主) 2年前

经测试是正常的。我这边是被dingo api 接管了。卸载后 重写render方法生效。

再次感谢

2年前 评论
chowjiawei 2年前
magein (作者) (楼主) 2年前
chowjiawei

大佬们 那如果 firstOrFail这种的 OrFail 想要自定义该怎么办

2年前 评论
haodudecao 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!