表單驗證是 Web 應用的核心環節。Laravel 提供了強大、靈活的驗證機制,支援豐富的內建規則、自定義錯誤訊息、甚至擴展專屬驗證邏輯。本文將系統整理驗證核心用法,助你快速掌握實戰技巧。
$validator = Validator::make(
$request->all(), // 待驗證資料
[
'name' => 'required|min:5|max:20',
'email' => 'required|email|unique:users',
'password' => 'required|confirmed|min:8',
]
);
規則之間用 | 分隔,也可用陣列寫法:'name' => ['required', 'min:5']。
if ($validator->fails()) {
// 驗證失敗,導向回上頁並攜帶錯誤
return redirect()->back()
->withErrors($validator)
->withInput();
}
// 驗證通過,取得已驗證資料
$validated = $validator->validated();
$errors->first('field'):取得欄位第一條錯誤$errors->get('field'):取得欄位所有錯誤陣列$errors->all():取得所有錯誤扁平化陣列$errors->has('field'):檢查欄位是否有錯誤$errors->first('field', '<div class="error">:message</div>'):自定義輸出格式@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
// 單一欄位錯誤顯示
<input type="text" name="email" value="{{ old('email') }}">
@error('email')
<span class="text-danger">{{ $message }}</span>
@enderror
Laravel 會自動將驗證錯誤綁定到視圖的 $errors 變數(MessageBag 實例),無需手動傳遞。
| 規則 | 說明 | 範例 |
|---|---|---|
| required | 欄位必填且不可為空 | 'title' => 'required' |
| 格式需為合法 Email | 'email' => 'email' | |
| unique:table,column | 資料庫唯一值檢查 | 'email' => 'unique:users,email' |
| exists:table,column | 資料庫存在性檢查 | 'role_id' => 'exists:roles,id' |
| min:max | 字串長度/數值/檔案大小範圍 | 'name' => 'min:3|max:50' |
| between:min,max | 介於範圍內 | 'age' => 'between:18,60' |
| confirmed | 需有對應 _confirmation 欄位且值相同 | 'password' => 'confirmed' |
| regex:pattern | 符合正則表達式(需用陣列寫法避免 | 衝突) | 'phone' => ['regex:/^09\d{8}$/'] |
| date / date_format:Y-m-d | 日期格式驗證 | 'birthday' => 'date_format:Y-m-d' |
| mimes:jpg,png | 上傳檔案 MIME 類型限制 | 'avatar' => 'mimes:jpeg,png|max:2048' |
| nullable | 允許欄位為 null(搭配其他規則使用) | 'bio' => 'nullable|max:500' |
$messages = [
'required' => ':attribute 為必填欄位。',
'email.unique' => '此 Email 已被註冊,請直接登入。',
];
$validator = Validator::make($input, $rules, $messages);
編輯 resources/lang/zh_TW/validation.php:
return [
'custom' => [
'email' => [
'required' => '請輸入電子信箱。',
'unique' => '這個信箱已經被使用囉!',
],
],
'attributes' => [
'email' => '電子信箱',
'password' => '密碼',
],
];
Validator::extend('phone_tw', function ($attribute, $value, $parameters, $validator) {
return preg_match('/^09\d{8}$/', $value);
});
// 使用時
'rule' => 'phone_tw'
執行 php artisan make:rule PhoneNumber 產生類別:
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class PhoneNumber implements Rule
{
public function passes($attribute, $value)
{
return preg_match('/^09\d{8}$/', $value);
}
public function message()
{
return ':attribute 格式錯誤,請輸入 09 開頭 10 碼手機號碼。';
}
}
控制器中直接使用:'phone' => [new PhoneNumber()]。
繼承 Illuminate\Validation\Validator,定義 validateXxx 與 replaceXxx 方法,再透過 Validator::resolver() 註冊。
將驗證邏輯封裝至專屬類別,控制器更乾淨:
php artisan make:request StoreUserRequest
public function rules()
{
return [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users,email',
];
}
public function messages()
{
return [
'email.unique' => '此信箱已註冊。',
];
}
控制器方法型別提示:public function store(StoreUserRequest $request),驗證失敗自動導向回上頁。
Laravel 驗證系統極度彈性:從簡單的閉包規則到完整的 Rule 類別、Form Request,滿足不同規模專案需求。建議優先使用 Form Request + Rule 類別 組合,兼顧可讀性、可測試性與維護性。