引言
上一章我講到了使用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領域原創作者
本作品採用《CC 協議》,轉載必須註明作者和本文連結