Laravel 學習筆記(14) - Form 表單資料驗證

Form Validation

Laravel 包含了一個 Validation 類別,專門用來處理資料驗證。使用 Validator 類別的 make() 方法來建立驗證:
Validator::make(data, rules, messages, customAttributes)
參數說明:
  • data:陣列。是準備要驗證的資料。
  • rules:陣列。驗證規則。
  • messages:陣列。驗證失敗後要回傳的訊息。
除了 data 及 rules,後面的兩個參數都可省略。

表單資料驗證

在"微型部落格"的例子中,我們要驗證標題是否有填寫資料。首先,打開 app/controllers/HomeController.php,修改 store() 方法,加入驗證:
public function store()
{
    $input = Input::all();
    $rules = ['title' => 'required'];
    $messages = ['required' => '! 欄位不能空白'];

    $validator = Validator::make($input, $rules, $messages);

    if ($validator->passes()){
        $post = new Post;
        $post->title = $input['title'];
        $post->content = $input['content'];
        $post->save();

        return Redirect::to('post');
    }

    return Redirect::to('post/create')
            ->withInput()
            ->withErrors($validator);
}
我們利用 Input::all() 會取得表單欄位及資料的陣列,像這樣:
['title'=>'標題輸入的文字',
'content'=>'內容輸入的文字']
將它送給 Validator::make() 的第一個參數。

接著我們建立規則:
$rules = ['title' => 'required'];
  • title:是表單欄位的名稱。
  • required:是關鍵字,表示這個欄位為必填,也就是不能空白。
*註:查詢更多的驗證規則關鍵字

再來是要傳回的錯誤訊息,
$messages = ['required' => '! 欄位不能空白'];
required 為關鍵字,對應到規則裡的所有指定為 required 的項目。值就是要顯示的訊息。

$validator->passes() 為 true 時,表示通過驗證,這時候才進行資料庫新增的動作。相反地,如果 $validator->fails() 為 true,表示驗證失敗,不做任何動作並返回表單頁面。

在驗證未通過,返回表單頁面的同時,可以回傳資料:
return Redirect::to('post/create')
            ->withInput()
            ->withErrors($validator);
重導頁面到 post/create 也就是表單頁面。withInput() 會同時把使用者有輸入資料的欄位的值回傳。withErrors() 則是把驗證的錯誤結果回傳。

View 的部份

打開 app/views/site/create.blade.php,將原本的:
{{Form::text('title')}}<br>
在下方增加錯誤訊息為:
{{Form::text('title')}}
@if ($errors->has('title'))
    <div style="color:red;">{{ $errors->first('title') }}</div>
@endif
<br>
$errors 是 MessageBag 類別的實體。基本上,$errors 存在於每個 view 中,我們可以在有需要的時候才去呼叫它。而為什麼 $errors 會有我們回傳的 $validator 中的訊息呢?因為 Laravel 自動將它們綁定(bind)了。

檢查 $errors->has('title') 如果有資料才顯示我們的錯誤訊息 $errors->first('title')

好了,你現在試著不要在標題中輸入任何資料,然後按"發表文章"按鈕,看看有沒有在欄位下方出現錯誤訊息。

你另外可以試看看,當標題是空的,但是有輸入內容時,送出資料會發生什麼事?內容的資料會被保留。

假設你把 HomeController@store 中的 ->withInput() 這一行拿掉,做同樣的動作,內容欄位就會被清空,而沒有被保留。

同一欄位,多個驗證規則

要對同一欄位加入多個驗證規則,每個規則必須用直線( | )分隔。
我們讓標題除了不能空白,還必須輸入超過 5 個字,在 HomeController@store 中改兩行:
$rules = ['title' => 'required|min:5'];
$messages = ['required' => '! 欄位不能空白', 'min' => '! 必須超過5個字'];
min 是關鍵字,後面接數字。min:5 表示字數最少要 5 個字。同樣用 min 關鍵字設定錯誤訊息。

這樣就完成了,view 完全都不用改。現在標題輸入少於 5 個字,就會出現新的錯誤訊息了。
本文網址:http://blog.tonycube.com/2015/01/laravel-14-form.html
Tony Blog 撰寫,轉載時請註明出處及文章連結,謝謝 😀

我要留言

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。