上一章我講到了使用FormBuilder讓後端開發者快速構建前端表單頁面,而為了示例, 直接在store方法內把表單數據一股腦存到了資料庫。 這!很!危!險!
本文教你正確地驗證用戶表單提交的數據,那就是十餘年堅定好用的Laravel驗證器。
開始之初,我把上一節代碼再貼出來,看一看原始的模樣:
public function store(Request $request){ $event = Event::create([$request->input()]); flash('Event created!')->success(); return redirect()->route('events.show')->with('event', $event);}
你看,那一句 Event::create([$request->input()]) 就是妥妥的懶人方法。把Request請求的表單數據原封不動地傳入到create方法內, 並寫入了資料庫。
當然,在Event模型內,我已經加上 $fillable 用於標記那些可以寫入數據的欄位了,但是仍然不夠。 僅指定欄位可以寫入,但是寫什麼值沒有過濾,是不是缺了一大塊。
用戶的輸入從來都不能直接拿來用,我要做一個關卡,層層把關,有效的數據放進去,無效的數據擋在門外。
在上面的代碼內再添加一些代碼:
其中 $request->validate() 方法是實例化了一個 Validator 對象,並默認使用 $request->input() 所有的輸入數據作為驗證對象。 重要的是那些驗證規則,我來逐一為你解讀。驗證規則內使用的都是laravel內置寫好了的規則,拿來即用。
首先是對欄位 name 的驗證,要求必填,且是字符串類型,最短要求10個字符,最長50個字符:
'name' => 'required|string|min:10|max:50',
然後是 max_attendees 欄位,要求必填,必須是整型,數位2-5個之間。也就是 10-99999 之間的數字。
'max_attendees' => 'required|integer|digits_between:2,5',
欄位 description 的驗證沒有那麼多,僅要求必填,要求是字符串:
'description' => 'required|string'
有了驗證規則之後,我們需要承載驗證失敗的那些錯誤提示信息。因為錯誤信息是全局通用的, 所以為了全局生效,修改視圖模板文件,追加以下內容:
<div class="container"> @if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif @yield('content')</div>
其中 $errors 對象包含了所有的表單驗證錯誤的提示信息。這樣,在所有使用了該模板的視圖內, 都會繼承錯誤提示信息。簡直是「一次編寫,處處能用」。
為了檢查是不是表單驗證生效了,你可以直接在空白表單,點擊「提交」按鈕,輸出內容大致如下:
紅色警告部分,就是視圖模板文件裡 $errors 發揮作用了。
錯誤提示信息,是laravel內置驗證規則給定的,如果你覺得提示信息不夠詳盡,不太滿意,自己寫也是沒問題的。 我把上面的驗證規則重寫一下。
不準備使用 $request->validate() 方法了,直接用 Validator 對象構造驗證,效果一模一樣。
代碼如下:
最特殊的是 required 驗證規則內的 :attribute 佔位符了。這個是一個佔位符用於在某個欄位調用此驗證規則是, 傳入字符名。
至於為啥這麼寫?Validator就是這樣設計的!
本文初步介紹了laravel驗證器內置規則的使用,以及如何將驗證信息渲染到視圖文件內。 並介紹了自定義驗證錯誤提示信息的使用方法。
Happy coding :-)
我是@程式設計師小助手,專注編程知識,圈子動態的IT領域原創作者