Skip to main content

什麼是自訂驗證規則

Laravel 內建了豐富的驗證規則,但仍有需要應用程式專屬檢驗邏輯的場合。透過自訂驗證規則,可以將可重複利用的驗證邏輯定義為類別或 closure,並與標準規則同樣的方式使用。 定義自訂規則主要有兩種方式。
  • 規則物件(Rule Object) — 可重複利用性高、易於測試
  • Closure — 適合只使用一次的簡易規則

規則物件

產生規則類別

make:rule Artisan 指令產生新的規則類別。產生的類別會置於 app/Rules 目錄下。

實作 ValidationRule 介面

於產生的類別中實作 validate 方法。此方法在驗證失敗時呼叫 $fail closure。
在傳給 $fail closure 的字串中可以使用 :attribute 佔位符。Laravel 會將其替換為欄位名稱。

套用規則物件

將規則物件的實例傳入驗證陣列即可。
在 Form Request 的 rules() 方法中同樣可以使用。

使用翻譯 key 的錯誤訊息

除了硬編碼錯誤訊息外,也可以使用翻譯 key。
在翻譯檔 lang/zh_TW/validation.php 中加入訊息。

加入多個錯誤訊息

若要對單一欄位回報多個錯誤,可多次呼叫 $fail

基於 Closure 的規則

在應用程式中僅使用一次的簡單規則,可不建立類別而以 closure 定義。
Closure 規則以行內方式定義故非常方便,但重複利用及獨立測試較不便,建議將於多處使用的邏輯抽取為規則物件。

Implicit 規則(值為空亦執行)

預設情況下,若欄位為空或不存在,自訂規則不會執行。若希望對空值也執行規則,可加上 --implicit 選項產生類別。
產生的類別實作了 ImplicitRule 介面。此介面本身不含額外方法,僅作為對 Laravel 傳送訊號之用。
ImplicitRule 僅向 Laravel 表明「屬性為必要」。當值為空時是否實際讓驗證失敗,取決於 validate 方法的實作。

資料存取

DataAwareRule — 存取整個表單的資料

若希望依其他欄位的值進行驗證,可實作 DataAwareRule 介面。setData 方法會在驗證開始前自動被呼叫。
使用範例:

ValidatorAwareRule — 存取 Validator 實例

若要存取 Validator 所擁有的所有資訊(失敗的規則、自訂訊息等),可實作 ValidatorAwareRule 介面。

實務應用情境

中文字元檢查

驗證全形/半形字元的規則。

電話號碼格式驗證

驗證台灣電話號碼格式的規則。

帶有租戶 ID 的唯一性約束

多租戶應用程式中常見的、限於租戶範圍內的唯一性約束。
1

建立規則類別

2

於 Form Request 使用

3

更新時排除 ID

更新既有資料時,需排除自身的 ID 進行重複檢查。

於服務提供者註冊規則

以 Validator::extend() 新增規則

使用 Validator::extend() 可以以字串形式('rule_name')使用自訂規則。於 AppServiceProviderboot() 方法中註冊。
Validator::extend() 註冊的規則可以字串形式指定。
Validator::extend() 是比規則物件更舊的註冊方式。新專案建議使用實作 ValidationRule 介面的規則物件。

以靜態方法加入 Rule 類別

透過對 Rule Facade 新增 macro,可提供類似 Rule::myRule() 的流暢 API(Fluent API)。

內部實作細節

讓我們看看 Illuminate\Validation\Validator 如何呼叫自訂規則。 在 Validator 中,validateAttribute() 會處理各欄位。若規則實作 ValidationRule 介面,則會呼叫 validateUsingCustomRule() 方法。
ImplicitRule 的處理由 isImplicit() 方法判斷,即便值為空亦會執行規則檢查。
DataAwareRuleValidatorAwareRule 可以同時實作。若類別同時擁有兩個介面,兩者皆會進行注入。

相關頁面

驗證(入門)

查看 Controller 及 Form Request 中的標準驗證方式。
最後修改於 2026年8月2日