上一章講述了表單數據驗證,從前端頁面接收用戶的輸入信息,通過POST方法提交數據到相應路由地址, 並使用Request請求體的validate方法,默認傳入request()->input()的參數,並調用傳入的驗證規則, 從而實現數據的初步篩選。
把數據驗證,驗證規則,和控制器的邏輯處理代碼混合在一起,是不是有點怪怪的?我們說,一個中間層只做一件事情,這樣才能鬆耦合,提高魯棒性。
所以有了這篇文章,教你把數據驗證提煉出來。
laravel在請求相關的業務邏輯上設計的很靈活,你完全可以把驗證流程從控制器方法中剝離出去, 這樣你只需在相關的層面,專注於相關的邏輯就可以了。
首先使用命令行創建一個請求體對象:
php artisan make:request EventStoreRequest
輸出內容如下:
Request created successfully
上述方法會生成一個文件位於 app/Http/Requests/EventStoreRequest.php,我們把系統默認的代碼貼出來:
namespace App\Http\Requests;use Illuminate\Foundation\Http\FormRequest;class EventStoreRequest extends FormRequest { public function authorize() { return false; } public function rules() { return []; }}
其中 authorize方法用於實現邏輯判斷,那些用戶,或者滿足那些條件可以使用該請求體。返回 false表示所有調用均不被允許驗證,也就是不會調用任何 rules方法聲明的規則。
此處我們還沒有關於權限判斷的需求,所以,讓所有調用此請求類的方法,都默認調用驗證規則,只需修改上述方法如下:
public function authorize(){ return true;}
其中 rules方法執行了需要執行的驗證器的規則,laravel默認內置了很多常用規則,基本夠用。使用方法見上一節我們的文章。
現在,把上一節中所使用的驗證規則拿來,修改 rules 方法如下:
public function rules(){ return [ 'name' => 'required|min:10|max:50', 'max_attendees' => 'required|integer|digits_between:2,5', 'description' => 'required' ];}
規則所表示的意義我們在上一節已經詳細介紹了。我們把目光放在如何使用該請求體。
回到控制器 EventController 的 store 方法內,這個是restfulapi 中用於接收POST請求體數據,並寫入資料庫的操作。此處我們需要指定請求體類型,使其默認使用 EventStoreRequest,這樣就可以發揮驗證規則的作用了。
使用依賴注入方式,直接在 store 方法內實例化一個請求體:
use App\Http\Requests\EventStoreRequest;public function store(EventStoreRequest $request){ $event = Event::create($request->input()); return redirect()->route('events.show', ['event' => $event]);}
使用此方法,使我們的代碼精簡了很多。最重要的數據驗證,交給了 EventStoreRequest 類來完成,這就完成了代碼層的分離。
默認內置的驗證規則所返回的錯誤信息提示,不滿足使用的話,還可以自定義,在 EventStoreRequest 內實現 messages 方法就可以了:
public function messages(){ return [ 'required' => '必填欄位 :attribute', 'name.min' => '最少10個字符', 'name.max' => '最多50個字符', 'max_attendees.digits_between' => '2-5位數字' ];}
這完全是上一章的手動自定的返回信息,寫在此處作為數組返回就搞定了。
本文深入laravel數據驗證的方法,從特殊走向一般,並嘗試把驗證相關的代碼從控制器內分離出來。使用自定義的請求體類,成功實現了代碼的分離,而可控制性也更強了。而驗證規則,和自定義的錯誤信息,則沒有一絲絲改變!
Happy coding :-)
我是@程式設計師小助手,專注編程知識,圈子動態的IT領域原創作者