laravel 表单验证FormRequest统一处理返回值

基础的

一般来说,我们都会对请求的参数进行验证,比如是否缺失某个参数

此时如果用if(参数是否存在)…else…的话,会显得不优雅,且重复代码量大

因此,我们会用到laravel框架提供的FormRequest类,比如

class LoginRequest extends FormRequest
{
    public function rules()
    {
        $rules = [
            'name'       => 'required|max:12',// 表示name是必须的,且最大长度12
            'password'       => 'required|max:64'
        ];
        return $rules;
    }
    
    // 重写父类方法failedValidation
    protected function failedValidation(Validator $validator)
    {
        $error = $validator->errors()->all();
        throw  new HttpResponseException(response()->json(['code' => 400, 'message' => $error[0]]));
    }
}

在Controller中使用如下:

    public function registerByName(AccountRequest $request)
    {
        return 1;
    }

此时当我们请求此接口时,如果不传递"name"参数,则会直接返回如下报错信息

{"code":400,"message":"The name field is required."}

OK!这样我们的controller看上去又清爽了很多

进阶的

但,我们有没办法让FormRequest更清爽?有的,去掉failedValidation!在handlers中统一处理!
步骤如下
1.在app\Exceptions\Handlers.php文件中(此文件在laravel项目创建时就存在)重写如下方法:

class Handler extends ExceptionHandler
{
    protected function invalid($request, ValidationException $exception)
    {
   		// 这里做你任何想做的事情,这里只是例子
        return response()->json($exception->errors());
    }
}

2.去掉LoginRequest中的failedValidation方法
3.最后LoginRequest的代码如下

class LoginRequest extends FormRequest
{
    public function rules()
    {
        $rules = [
            'name'       => 'required|max:12',// 表示name是必须的,且最大长度12
            'password'       => 'required|max:64'
        ];
        return $rules;
    }
}

OK,现在你只需要写rules就可以啦~

更进阶的

但,表单验证失败时返回的错误是英文,有没办法改为中文?当然可以

  1. 在路径resources\lang中添加文件夹zh-cn,并复制resources\lang\en中的所有文件到zh-cn中,
  2. 然后修改resources\lang\zh-cn\validation.php文件中的 ‘required’ 字段,修改成你想要的中文内容即可!
  3. 修改config\app.php中的 ‘locale’ => ‘en’,改为 ‘locale’ => ‘zh-cn’

又OK!此时表单验证失败时自动返回你想要的内容
效果如下:

{"code":400,"message":"缺少参数:name"}

你可能感兴趣的:(laravel,laravel,php,javascript)