解決 Ajax 表單請求驗證失敗報 422 錯誤

xiaocailc發表於2019-01-13

描述

laravel驗證類不同的請求方式,驗證錯誤返回的型別也不同

  • 普通表單請求驗證失敗會重定向之前的頁面,錯誤資訊會快取並賦值到檢視中
  • ajax請求驗證失敗,會返回422錯誤

解決問題

解決ajax請求的422報錯資訊,自定義返回資料型別

前提條件

猶豫laravel的csrf驗證機制,為了測試,先去掉ajax請求時這個驗證機制
修改檔案:app->Http->Middleware->VerifyCsrfToken.php

// 在$except屬性中新增不要檢查的路由即可
protected $except = [
    '/admin/del-sys-user',
    '/admin/add-sys-user',
];

自定義驗證錯誤返回型別

修改檔案:在你寫的驗證類中,即app->Http->Requests->FormPost.php
實現原理:重寫驗證錯誤的響應處理
實現方法:

use Illuminate\Contracts\Validation\Validator;
use Illuminate\Validation\ValidationException;
use Symfony\Component\HttpFoundation\Response;

// 重寫ajax請求驗證錯誤響應格式(防止驗證422報錯)
protected function failedValidation(Validator $validator)
{
    // 此處自定義您想要返回的資料型別
    $data = [
        'code' => 400,
        'msg' => $validator->errors()->first(),
    ];
    $respone = new Response(json_encode($data));
    throw (new ValidationException($validator, $respone))
        ->errorBag($this->errorBag)
        ->redirectTo($this->getRedirectUrl());
}

結果驗證

file

相關文章