Laravel框架表單驗證格式化輸出的方法
最近在公司的項目開發(fā)中使用到了 laravel 框架,采用的是前后端開發(fā)的模式。接觸過前后端開發(fā)模式的小伙伴應(yīng)該都知道,后端返回的數(shù)據(jù)格式需要盡可能搞得保證一致性,這樣前端在處理時也方便處理。我們先通過觀看下面的兩張接口返回的效果圖吧,這樣或許會更加的直觀一些。
laravel默認(rèn)的輸出格式(圖一)
修改后的輸出格式(圖二)
或許通過上面兩張圖,你還是未看出有什么區(qū)別的話。這里我用文字描述一下吧。 這種情況是發(fā)生在laravel做表單驗證的情況下發(fā)生的。前端向我后端接口發(fā)送一個POST請求時,發(fā)送了一個title和body的字段。我后端需要對兩個字段做一些非空驗證。按照框架手冊來進行的話,輸出的格式就是圖一的格式。然后后端統(tǒng)一的輸出格式是圖二中的格式,如果按照圖一的格式輸出肯定是不行,這樣就需要我們做一個特殊處理。
問題排查
首先我們可以通過文檔參看到如下信息。下面劃線的部分,提到的返回信息是將所有未驗證通過的數(shù)據(jù)都返回給前端,就如圖一中的數(shù)據(jù)格式。
laravel默認(rèn)的輸出格式(圖三)
預(yù)期效果
通過圖三我們知道了 laravel 默認(rèn)的是返回一個帶 422 的 http 狀態(tài)碼并且將所有的驗證錯誤信息都返回。
然而我們需要的只是如圖二的格式,單個的輸出錯誤信息。大致的解決思路就是在輸出的時候,我們?nèi)ツJ(rèn)顯示第一個未通過的驗證信息,當(dāng)通過之后,之前第二個未嚴(yán)重通過的就變成了第一個,這樣依次循環(huán)下去,我們的每個數(shù)據(jù)就得到了驗證。驗證的地方我們選擇框架異常統(tǒng)一處理的地方,這樣每次驗證都自動的進行處理。
解決方案
該框架是 laravel5.8 的情況下進行編寫,如果版本不同,或許還需要特殊的處理,不過處理的思路可以參考下面的。
1.創(chuàng)建一個表單驗證器。執(zhí)行下面的命令之后,我們在php app/Http/Requests
目錄下面就可以看到該類文件了。
php artisan make:request ProjectValidate
2.定義驗證規(guī)則。rules 方法是定義驗證規(guī)則,而 messages 方法則是定義返回的錯誤信息,該方法也可以省略掉,這樣提示的信息就是英文而不是圖一或圖二看到的中文了。
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class ProjectValidate extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'title' => 'bail|required', 'body' => 'required', ]; } /** * define the validation message * * @return array */ public function messages() { return [ 'title.required' => '文章標(biāo)題必填', 'body.required' => '文章內(nèi)容必填', ]; } }
3.使用驗證器。這里我定義了一個控制器,在 addData 方法中,使用依賴注入的方式去實現(xiàn)數(shù)據(jù)的驗證。記住,該方法體在未通過數(shù)據(jù)驗證的情況下是不會去執(zhí)行的。
namespace App\Http\Controllers\Backend\Project; use App\Http\Requests\ProjectValidate; use App\Http\Controllers\Backend\UCenter; class Index extends UCenter { public function index() { return success(); } public function addData(ProjectValidate $request) { $validated = $request->validated(); return success($validated); } }
4.統(tǒng)一處理數(shù)據(jù)格式。找到php App\Exceptions\Handler.php
文件,找到下面的方法,修改為如下內(nèi)容。這時候在做表單驗證就會顯示圖二的格式信息了。
public function render($request, Exception $exception) { if ($exception instanceof ValidationException) { // 只讀取錯誤中的第一個錯誤信息 $errors = $exception->errors(); $message = ''; // 框架返回的是二維數(shù)組,因此需要去循環(huán)讀取第一個數(shù)據(jù) foreach ($errors as $key => $val) { $keys = array_key_first($val); $message = $val[$keys]; break; } return response()->json(['code' => 1001, 'message' => $message, 'data' => []], 422); } return parent::render($request, $exception); }
總結(jié)
1.優(yōu)勢
輸出固定的格式,前端在處理數(shù)據(jù)的時候,不需要做特別的格式上面調(diào)整。
2.劣勢
這樣的方式驗證,每驗證一次,就會向后端發(fā)送一個 http 請求。
以上所述是小編給大家介紹的Laravel框架表單驗證格式化輸出的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Python中對數(shù)組集進行按行打亂shuffle的方法
今天小編就為大家分享一篇Python中對數(shù)組集進行按行打亂shuffle的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11