什麼是自訂驗證規則
Laravel 內建了豐富的驗證規則,但仍有需要應用程式專屬檢驗邏輯的場合。透過自訂驗證規則,可以將可重複利用的驗證邏輯定義為類別或 closure,並與標準規則同樣的方式使用。 定義自訂規則主要有兩種方式。- 規則物件(Rule Object) — 可重複利用性高、易於測試
- Closure — 適合只使用一次的簡易規則
規則物件
產生規則類別
以make:rule Artisan 指令產生新的規則類別。產生的類別會置於 app/Rules 目錄下。
實作 ValidationRule 介面
於產生的類別中實作validate 方法。此方法在驗證失敗時呼叫 $fail closure。
$fail closure 的字串中可以使用 :attribute 佔位符。Laravel 會將其替換為欄位名稱。
套用規則物件
將規則物件的實例傳入驗證陣列即可。rules() 方法中同樣可以使用。
使用翻譯 key 的錯誤訊息
除了硬編碼錯誤訊息外,也可以使用翻譯 key。lang/zh_TW/validation.php 中加入訊息。
加入多個錯誤訊息
若要對單一欄位回報多個錯誤,可多次呼叫$fail。
基於 Closure 的規則
在應用程式中僅使用一次的簡單規則,可不建立類別而以 closure 定義。Implicit 規則(值為空亦執行)
預設情況下,若欄位為空或不存在,自訂規則不會執行。若希望對空值也執行規則,可加上--implicit 選項產生類別。
ImplicitRule 介面。此介面本身不含額外方法,僅作為對 Laravel 傳送訊號之用。
資料存取
DataAwareRule — 存取整個表單的資料
若希望依其他欄位的值進行驗證,可實作DataAwareRule 介面。setData 方法會在驗證開始前自動被呼叫。
ValidatorAwareRule — 存取 Validator 實例
若要存取 Validator 所擁有的所有資訊(失敗的規則、自訂訊息等),可實作ValidatorAwareRule 介面。
實務應用情境
中文字元檢查
驗證全形/半形字元的規則。電話號碼格式驗證
驗證台灣電話號碼格式的規則。帶有租戶 ID 的唯一性約束
多租戶應用程式中常見的、限於租戶範圍內的唯一性約束。1
建立規則類別
2
於 Form Request 使用
3
更新時排除 ID
更新既有資料時,需排除自身的 ID 進行重複檢查。
於服務提供者註冊規則
以 Validator::extend() 新增規則
使用Validator::extend() 可以以字串形式('rule_name')使用自訂規則。於 AppServiceProvider 的 boot() 方法中註冊。
Validator::extend() 註冊的規則可以字串形式指定。
以靜態方法加入 Rule 類別
透過對Rule Facade 新增 macro,可提供類似 Rule::myRule() 的流暢 API(Fluent API)。
內部實作細節
讓我們看看Illuminate\Validation\Validator 如何呼叫自訂規則。
在 Validator 中,validateAttribute() 會處理各欄位。若規則實作 ValidationRule 介面,則會呼叫 validateUsingCustomRule() 方法。
ImplicitRule 的處理由 isImplicit() 方法判斷,即便值為空亦會執行規則檢查。
相關頁面
驗證(入門)
查看 Controller 及 Form Request 中的標準驗證方式。