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

2020-10-10 程式設計師小助手

引言

上一章我講到了使用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領域原創作者

相關焦點

  • 3分鐘短文 | Laravel 表單驗證數組的數據
    引言本文說一個小的知識點,在表單驗證中,對數組數據進行驗證, 我們需要進行兩項,一項是數組本身的驗證,一項是數組元素的驗證。三個欄位的驗證需求如下:name欄位,必填,每個元素唯一,且至少有3個元素amount欄位,必填,元素要求都是整數,且最少有1個元素description欄位,必填,元素可有可無,且元素都是字符串。
  • 3分鐘短文 | Laravel表單驗證沒規則可用?你試試自定義,真香
    引言Laravel內部提供了很多用於表單驗證的規則,都是通過 Validator 對象進行解析和處理。 但是我們會遇到現有規則無法滿足驗證需求的情況。為了驗證方式的統一,不準備把這個規則寫到控制器邏輯內。用laravel的方式該如何實現呢?laravel內我們可以使用擴展功能,自定義驗證規則,擴展 Validator 對象的驗證規則。 我們需要把擴展規則寫到 AppServiceProvider 內,使得系統加載時可以正確地使用。
  • 3分鐘短文:Laravel表單驗證的「指揮中心」:表單請求類
    但是無論在控制器內進行驗證,還是前置到路由器內驗證,都會加重這些區域的代碼重量,特別是對於複雜的驗證邏輯,甚至使得控制器或者路由功能不那麼純粹。這就是本文我們重點要介紹的 FormRequest 表單請求類。
  • 3分鐘短文:Laravel控制器用法光速入門
    引言上一章我們介紹了laravel路由註冊中的「花拳繡腿」,樣樣都是那麼優雅而實用。路由傳遞過來的參數,在經過中間件驗證和導向之後,應該去控制器接受處理了。laravel中控制器是幹什麼的,以及怎麼用。
  • 3分鐘短文:Laravel把數據驗證的手伸向「請求體」
    引言上一章講述了表單數據驗證,從前端頁面接收用戶的輸入信息,通過POST方法提交數據到相應路由地址, 並使用Request請求體的validate方法,默認傳入request()->input()的參數
  • 3分鐘短文:Laravel的「南天門」,過濾掉七七八八的數據
    引言上一章我們教會大家如何從用戶表單內正確地獲取數據,可是沒有講,獲取到的數據到底有啥用,或者說,有的用戶提交的數據壓根兒就沒正經填,那些錯亂無效的數據,如果直接放到資料庫,純粹是對資料庫的汙染。如果你對源碼稍加留意,可能就會注意到,laravel的 Controller 類引入了 ValidatesRequests 這個驗證 trait。
  • 3分鐘短文 | Laravel 用戶授權原來內置了這麼多方法
    引言laravel已經內置了一套授權和權限分配的功能,我們不用從零開始設計,這方便了很多。但是, 因為集成在框架內的緣故,很多時候對於用戶體系甚至有些陌生。本文通過一個簡單的需求,判斷有效用戶, 逐一為大家實現。
  • 3分鐘短文|Laravel 用戶授權原來內置了這麼多方法
    學習時間比如在前端有一個界面,表單的提交參數如下:<form role="form" method="POST" action="{{ url('/auth/login') }}">其中路由 /auth/login 是框架內集成的方法。如果有效的數據則進行驗證登陸,如果無效則執行錯誤邏輯。 那麼問題來了,能否手動實現這些邏輯呢。
  • 3分鐘短文:刀刃向內,Laravel緩存測試簡單入門
    打開命令行工具,進入到laravel工作根目錄,運行命令:.文件上傳測試我們先來模擬一個虛擬的文件,執行表單文件上傳功能我們首先構造了一個 UploadFile 對象,然後調用 post 方法訪問 upload-route, 並將上傳參數正確地填寫
  • Laravel 自定義封裝表單驗證類
    Laravel版本6.x場景:為添加或者更新用戶的時候自動驗證表單創建表單請求使用 Artisan 命令 make:request 來創建表單請求類:php artisan* * @return array */ public function rules() { return [ // ]; }}然後再創建一個用戶的請求表單驗證類去繼承app\Http\Requests\Request.php 文件下的類使用 Artisan 命令
  • 3分鐘短文:Laravel跟用戶打交道,從拿他們的數據開始
    本文不會教你規避危險!代碼時間我們在講路由規劃的時候,說了如何使用url的位置參數綁定的方式進行導向,其實那也是一種獲取用戶輸入數據的方式, 只不過,傳入的位置參數一般都人畜無害,公開訪問,任你來來往往。
  • 3分鐘短文:Laravel Form讓你不再寫HTML的好庫
    引言作為後端工程師的你,是不是面對一堆JS,CSS感覺無比抓狂。如果能擺脫大量的冗餘的HTML代碼塊, 那該多好啊。laravel作為擴展性極強的框架,自然是為廣大後端開發者賦能。Form::text第一個參數是分配給輸入元素的name屬性的字符串,該值也將分配給id屬性,除非你在數組中明確為id分配值,並作為第三個參數傳遞。 第二個參數(當前設置為null)可用於設置表單欄位的value屬性。設置為null時,將使用空白值。
  • 3分鐘短文:用Laravel發一封「漂洋過海」的電子郵件
    本期先不講如何發郵件,我們先準備一個表單,把郵件需要的數據準備好。 注意表單是包裹在open與close之間的。 驗證數據 表單創建之後,我們要寫接收表單數據的方法,在接收處理之前,一定要對數據的有效性進行驗證。還記得我們前面講的內容嗎,使用 FormRequest 對象驗證表單欄位。
  • 3分鐘短文:素未謀面,Laravel資料庫模型初階入門
    本期就來講講laravel的模型初階用法。代碼時間模型是在代碼中抽象一層,把資料庫操作提取出來。laravel支持常用的資料庫產品, 我們以MySQL為例。首先在配置文件內,配置參數對資料庫連接。一般,如果不手動指定,laravel模型內的 $connection 就是取的配置文件內的這一行:'default' => env('DB_CONNECTION', 'mysql'),也即是mysql資料庫。接著我們通過遷移功能,創建一個遷移文件。這樣無需我們手動創建資料庫表。
  • 3分鐘短文:素未謀面,Laravel資料庫模型初階入門
    本期就來講講laravellaravel支持常用的資料庫產品, 我們以MySQL為例。首先在配置文件內,配置參數對資料庫連接。完成表單的欄位設計後,我們將設計的表應用到資料庫。為了驗證是否遷移成功,我們在命令行使用mysql客戶端連接目標資料庫。
  • 3分鐘短文:Laravel是怎麼發出一封電子郵件的?
    引言上一章我們為發電子郵件準備了貼心的表單,完善的數據驗證,那麼本篇我們講解如何在laravel內發送一封電子郵件。代碼時間laravel集成了熱門且功能強大的SwiftMailer庫,為我們封裝了發送郵件所需要的底層邏輯,所以我們只需關注發送的邏輯, 如何準備電子郵件的內容即可。
  • 3分鐘短文:Laravel slug,讓你的url地址更好記
    所以各種各樣的url地址,帶參數跳轉的,表單提交的,混為一談,製作出符合統一規範的路由很不容易。比如下面的路由,訪問一個地址,並且攜帶querystring參數:http://example.com/events.php?
  • 3分鐘短文:Laravel請求體內JSON格式數據的處理辦法
    引言前幾篇文章我們講了表單數據的接收,驗證等功能。也說到了傳送的數組如何處理, 今天我們說一下如果傳送的數據是JSON格式,其處理流程。其實接收請求參數的時候,我們可以使用laravel提供的 request 對象進行操作, 比如這樣接收:$data = json_decode($request->getContent(), true);其中 getContent 方法返回的就是原始的提交數據的字符串內容。
  • 3分鐘短文:Laravel請求對象方法極多,可不是花拳繡腿
    laravel提供了一個助手函數 request(),暴露了一個上下文的 Request 對象可全局操作。我們本文重點說說 用於的請求數據。那麼對於用於csrf攔截的欄位_token,系統生成,系統自檢,我們在表單中並不使用, 可以使用 except 方法將其排除在外。
  • 3分鐘短文 | Laravel 內3種數據校驗的寫法,你喜歡哪一個?
    在第一個規則下,驗證了names欄位必須為array類型,且長度至少為3。接著使用星號匹配數組內元素,要求都是string字符串,且不得重複 distinct,且每個字符串長度最小為3。laravel 5.5 以後的版本,你無需手動實例化 Validaor 對象,可以在 Request 對象直接調用 validate 方法實現。