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

eluotao發表於2019-05-09

歡迎使用社群 Markdown 編輯器寫文章!

一. 描述

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

  • Layui 的表單請求 validate 驗證失敗會重定向之前的頁面,錯誤資訊會快取並賦值到檢視中
  • ajax 請求驗證失敗,會返回 422 錯誤 這個錯誤會導致返回地址為紅色

二. 解決問題思路

  • 建立新的 Request 驗證類
  • 修改Controller控制器方法的 Request 的方法
  • 修改 validate 驗證返回程式碼 200

三. 操作方法

  1. 修改檔案:app->Http->Middleware->VerifyCsrfToken.php

程式碼

// 在$except屬性中新增不要檢查的路由即可
protected $except = [
    '/admin/del-sys-user',
    '/admin/add-sys-user',
];
  1. Laravel提供了生成Form Request的Artisan命令:

程式碼

$ php artisan make:request StoreCommentRequest
  1. 修改檔案:StoreCommentRequest.php 新增變數 $rules

程式碼

     //驗證規則可自己新增需要驗證的欄位
    protected $rules = [    
        'username' => 'required|alpha_num|regex:/^(?!([A-Za-z]+|d\d+)$)[A-Za-z\d]$/',
        'password' => 'required|min:8',
        'level' => 'required|numeric|between:1,4',
        'bili' => 'required|numeric|between:1,99'
    ];
  1. 修改檔案:StoreCommentRequest.phpauthorize 方法返回 true

程式碼

    public function authorize()
    {
        return true;
    }
    public function rules()
    {
        $rules = $this->rules;
        return $rules;
    }
    // 重寫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());
    }
  1. 修改UsersController控制器方法 \App\Http\Requests\StoreCommentRequest $request

程式碼

    public function store(\App\Http\Requests\StoreCommentRequest $request)
    {
             ...............

資訊來源:

  1. https://www.jianshu.com/p/0225e63454e8
  2. https://www.jianshu.com/p/658f979abfb7
  3. 部落格:解決 Ajax 表單請求驗證失敗報 422 錯誤
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章