Laravel中使用FormRequest进行表单验证及对验证异常进行自定义处理

本文主要展示的是,单独抽离,验证层(即参数验证)

为了简化controller参数验证,我们单独建立一个文件夹,作为我们参数层验证;具体异常抛出,以及Form Request的执行laravel官方文档已经很详细了,自行百度.下面仅展示案例,便于快速上手使用:

1.新建Requests文件夹

2.然后在新建NavRequest,参数验证类,继承FormRequest

<?php

namespace App\Http\Requests\Nav;

use Illuminate\Foundation\Http\FormRequest;

class NavRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        $rules = [
            'h5_id' => 'required |exists:h5_template,h5_id',
            'font_color'=>'string|nullable',
            'select_color'=>'string|nullable',
            'background_color'=>'string|nullable',
            'position'=>'int|required| between:0,1'
        ];
        return $rules;
    }

    public function messages()
    {
        $message = [
            'h5_id.required'      =>'h5_id必须填写',
            'h5_id.exists'      =>'h5_id不存在!',
            'position.required'      =>'请选择位置!'
        ];
        return $message;
    }

}
  • 第一个方法:authorize(),控制用户访问权限
  • 第二个方法:$rules(),返回验证的数组
  • 第三个方法:$message(),返回自定义的错误信息

3.控制器里面\

传统上我们这样使用,但是造成每个controller都需要对这些参数单独判断.代码复用率不高.

 public function navSet(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'h5_id' => 'required |int',
            'font_color'=>'string|nullable',
            'select_color'=>'string|nullable',
            'background_color'=>'string|nullable',
            'position'=>'int|required| between:0,1'
        ]);
        if ($validator->fails()) {
            return $this->output(null,'参数有误,请重试!',500);
        }
        $request_params=$request->all();

     //接下来实现你的业务逻辑....
}

当我们抽离出来参数验证层的时候,

 public function navSet(NavRequest $request)//将你抽离的参数层绑定到这里
    {
          $request_params=$request->all();
       
         //接下来处理你的业务逻辑...
    }

这样不管你在哪里绑定Navrequest这个参数验证类的时候,都会对参数进行验证

4.验证错误信息的返回

在这个地方我是写接口的,无论如何都接收不到错误信息.然后查看FoemRequest的错误返回信息:

看到这里这样写:如下图.

  protected function failedValidation(Validator $validator)
    {

        throw (new ValidationException($validator))
                    ->errorBag($this->errorBag)
                    ->redirectTo($this->getRedirectUrl());
    }

意思是重定向错误信息,但是作为接口开发者,很多时候我们需要返回前端指定的json数据,所以我们可以重写这个方法如下;

(特别注意,一开始没有重写栽了一个坑)

//1.在这里可以重新定义一个requestController类,,
//2.然后让他继承 FormRequest,
//3.最后重写FormRequest这个基类的failedvalidation方法

class RequestController extends FormRequest
{
    protected function failedValidation(Validator $validator) {
        $error= $validator->errors()->all();
        throw new HttpResponseException(response()->json(['msg'=>'error','code'=>'500','data'=>$error[0]], 500));

    }
}

这样当你的参数不符合自定义的验证规则的时候,就会在你的路由里面返回你自定义的错误信息了.

5.postman错误信息展示

扫描二维码关注公众号,回复: 6759406 查看本文章

猜你喜欢

转载自blog.csdn.net/cfun_goodmorning/article/details/83539026