3分鐘短文:十年窖藏,Laravel告訴你表單驗證的“正確姿勢”

程式設計師小助手發表於2020-10-10

引言

上一章我講到了使用FormBuilder讓後端開發者快速構建前端表單頁面,而為了示例,

直接在store方法內把表單資料一股腦存到了資料庫。

這!很!危!險!

img

本文教你正確地驗證使用者表單提交的資料,那就是十餘年堅定好用的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 用於標記那些可以寫入資料的欄位了,但是仍然不夠。

僅指定欄位可以寫入,但是寫什麼值沒有過濾,是不是缺了一大塊。

使用者的輸入從來都不能直接拿來用,我要做一個關卡,層層把關,有效的資料放進去,無效的資料擋在門外。

追加驗證

在上面的程式碼內再新增一些程式碼:

pic

其中 $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 物件包含了所有的表單驗證錯誤的提示資訊。這樣,在所有使用了該模板的檢視內,

都會繼承錯誤提示資訊。簡直是“一次編寫,處處能用”

為了檢查是不是表單驗證生效了,你可以直接在空白表單,點選“提交”按鈕,輸出內容大致如下:

pic

紅色警告部分,就是檢視模板檔案裡 $errors 發揮作用了。

自定義錯誤提示資訊

錯誤提示資訊,是laravel內建驗證規則給定的,如果你覺得提示資訊不夠詳盡,不太滿意,自己寫也是沒問題的。

我把上面的驗證規則重寫一下。

不準備使用 $request->validate() 方法了,直接用 Validator 物件構造驗證,效果一模一樣。

程式碼如下:

pic

最特殊的是 required 驗證規則內的 :attribute 佔位符了。這個是一個佔位符用於在某個欄位呼叫此驗證規則是,

傳入字元名。

至於為啥這麼寫?Validator就是這樣設計的!

寫在最後

本文初步介紹了laravel驗證器內建規則的使用,以及如何將驗證資訊渲染到檢視檔案內。

並介紹了自定義驗證錯誤提示資訊的使用方法。

Happy coding :-)

我是@程式設計師小助手,專注程式設計知識,圈子動態的IT領域原創作者

本作品採用《CC 協議》,轉載必須註明作者和本文連結
write-less-do-more-make-you-out-of-door

相關文章