首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Laravel 表單驗證完整指南:規則、錯誤處理與自定義擴展

     編輯:PHP 相關知識

Laravel 表單驗證完整指南:規則、錯誤處理與自定義擴展

表單驗證是 Web 應用的核心環節。Laravel 提供了強大、靈活的驗證機制,支援豐富的內建規則、自定義錯誤訊息、甚至擴展專屬驗證邏輯。本文將系統整理驗證核心用法,助你快速掌握實戰技巧。

一、基礎驗證流程

1. 建立驗證器實例

$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']。

2. 執行驗證與失敗處理

if ($validator->fails()) {
    // 驗證失敗,導向回上頁並攜帶錯誤
    return redirect()->back()
        ->withErrors($validator)
        ->withInput();
}

// 驗證通過,取得已驗證資料
$validated = $validator->validated();

二、錯誤訊息處理與視圖顯示

1. MessageBag 常用方法

  • $errors->first('field'):取得欄位第一條錯誤
  • $errors->get('field'):取得欄位所有錯誤陣列
  • $errors->all():取得所有錯誤扁平化陣列
  • $errors->has('field'):檢查欄位是否有錯誤
  • $errors->first('field', '<div class="error">:message</div>'):自定義輸出格式

2. Blade 視圖中顯示錯誤

@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' => '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'

四、自定義錯誤訊息

1. 直接傳遞給 Validator

$messages = [
    'required' => ':attribute 為必填欄位。',
    'email.unique' => '此 Email 已被註冊,請直接登入。',
];
$validator = Validator::make($input, $rules, $messages);

2. 語言檔案定義(推薦,支援多語系)

編輯 resources/lang/zh_TW/validation.php:

return [
    'custom' => [
        'email' => [
            'required' => '請輸入電子信箱。',
            'unique' => '這個信箱已經被使用囉!',
        ],
    ],
    'attributes' => [
        'email' => '電子信箱',
        'password' => '密碼',
    ],
];

五、進階:自定義驗證規則

1. 使用閉包擴展(簡單場景)

Validator::extend('phone_tw', function ($attribute, $value, $parameters, $validator) {
    return preg_match('/^09\d{8}$/', $value);
});

// 使用時
'rule' => 'phone_tw'

2. 使用專屬 Rule 類別(複雜邏輯、可測試、推薦)

執行 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()]。

3. 擴展驗證器類別(大型專案)

繼承 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 類別 組合,兼顧可讀性、可測試性與維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved