建立一個 form 其中包含一個 input field:
<form method="POST" action=""> <input type="text" id="item-amount" name="item-amount"> </form>
表單送出以後,會使用 controller 的 store()
來處理資料。這裡先驗證 item-amount
是否有輸入數值:
public function store(\Illuminate\Http\Request $request) { $validator = Validator::make($request->all(), [ 'item-amount' => 'required', ]; }
若使用者沒有輸入資料時 $validator->failes()
會回傳 true
:
if ($validator->fails()) { // 檢查發現錯誤 } else { // 資料都正確 }
在 HTML 中顯示錯誤訊息
由 Laravel Validator 中的說明,錯誤訊息會儲存在 session 中,並由 middleware 轉成 blade 變數,所以可直接加上是否有錯誤訊息的檢查語法:
@if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <form method="POST" action="">
資料驗證條件
前面的 validator 只有驗證使用者是否有輸入資料,這裡在多加上一個條件:數量必須大於 0 (gt:0
):
$validator = Validator::make($request->all(), [ 'item-amount' => 'required|gt:0', ];
發現錯誤後,回到表單輸入頁面,並將錯誤訊息傳給 view:
if ($validator->fails()) { return Redirect::to('/path/to/form') ->withErrors($validator); }
redirect 到表單頁面後,看到前端顯示錯誤提示:
自訂要顯示的錯誤訊息
上方的錯誤訊息是 Laravel 預設的,不過可以依照錯誤類型,自訂要顯示的錯誤訊息。
Validator:make()
的第 3 個參數,可用來針對不同的驗證條件,顯示不同的錯誤訊息:
$validator = Validator::make($request->all(), [ 'item-number' => 'required', 'item-amount' => 'required|gt:0', 'hu-id' => 'required', 'location-id' => 'required', ], [ // 給 '.required' 使用的訊息 'item-amount.required' => '數量為必填欄位', // 給 'gt:0' 使用的錯誤訊息 'item-amount.gt' => '數量必須大於 0', ]);
這樣錯誤訊息就會按照設定的來顯示:
在表單中標示錯誤的欄位
若輸入欄位很多,使用者可能需要花一些時間才能在網頁中找到輸入框。
為了讓使用者可以快速找到有問題的資料輸入欄位,可以在該欄位加上 CSS class,用來突顯欄位:
<input class="@error('item-amount') is-invalid @enderror" type="text" id="item-amount" name="item-amount">
這樣搭配 CSS 以後,就可以達到錯誤標示的效果:
備註:若需要在表單中,自動填入使用者輸入的數值,需要二個步驟:
- 將 input 傳給 view
- 透過 Laravel
old()
來拉資料
if ($validator->fails()) { return Redirect::to('/path/to/form') ->withErrors($validator) // 將使用者輸入的資料一併傳過去 ->withInput($request->input()); }
在 <input>
加上 value
:
<input type="text" id="item-amount" name="item-amount" value="{{ old('item-amount') }}" <!-- 帶入使用者填寫的資料 --> >