在 Yii 框架開發中,rules() 方法是模型層資料驗證的核心。本文整理了實務上最常用的字段驗證範例,涵蓋必填、長度、格式、類型等場景,助你快速建立健壯的表單驗證邏輯。
| 驗證器 | 適用場景 | 關鍵參數 |
|---|---|---|
| required | 必填欄位 | on、message |
| length | 字串長度限制 | min、max、tooShort、tooLong |
| match | 正則表達式匹配 | pattern、message |
| 電子郵件格式 | on、message | |
| url | 網址格式 | on、message |
| numerical | 數值型態 | integerOnly、message |
| safe | 大量賦值白名單 | — |
<?php
class ContactForm extends CFormModel {
public $id;
public $contact; // 聯絡人
public $tel; // 電話
public $fax; // 傳真
public $zipcode; // 郵遞區號
public $addr; // 地址
public $mobile; // 手機
public $email; // 信箱
public $website; // 網址
public $qq; // QQ 號
public $msn; // MSN
public $add_time; // 新增時間
public function rules() {
return array(
// 數值型欄位
array('id, add_time', 'numerical', 'integerOnly' => true),
// 大量賦值安全白名單(參考:safe 屬性詳解)
array('contact, tel, fax, zipcode, addr, mobile, email, website, qq, msn, add_time', 'safe'),
// 編輯場景專用驗證
array('contact', 'required', 'on' => 'edit', 'message' => '聯絡人必須填寫。'),
array('contact', 'length', 'on' => 'edit', 'min' => 2, 'max' => 10,
'tooShort' => '聯絡人長度請控制在 2-10 個字元。',
'tooLong' => '聯絡人長度請控制在 2-10 個字元。'),
// 電話/傳真格式:支援 3-4 碼區碼 + 7-8 碼號碼
array('tel', 'match', 'pattern' => '/^(\d{3}-|\d{4}-)(\d{8}|\d{7})?$/', 'message' => '請輸入正確的電話號碼。'),
array('fax', 'match', 'pattern' => '/^(\d{3}-|\d{4}-)(\d{8}|\d{7})?$/', 'message' => '請輸入正確的傳真號碼。'),
// 手機號碼(舊版號段,現代專案建議更新為最新號段)
array('mobile', 'match', 'pattern' => '/^13[0-9]{1}[0-9]{8}$|15[0189]{1}[0-9]{8}$|189[0-9]{8}$/', 'message' => '請輸入正確的手機號碼。'),
// 信箱、郵遞區號、網址、QQ、MSN
array('email', 'email', 'on' => 'edit', 'message' => '信箱格式錯誤。'),
array('zipcode', 'required', 'on' => 'edit', 'message' => '郵遞區號必須填寫。'),
array('zipcode', 'numerical', 'on' => 'edit', 'message' => '郵遞區號為 6 位數字。'),
array('zipcode', 'length', 'on' => 'edit', 'min' => 6, 'max' => 6,
'tooShort' => '郵遞區號長度為 6 位數。', 'tooLong' => '郵遞區號長度為 6 位數。'),
array('website', 'url', 'on' => 'edit', 'message' => '網址格式錯誤。'),
array('qq', 'match', 'pattern' => '/^[1-9]{1}[0-9]{4,11}$/', 'message' => '請輸入正確的 QQ 號碼。'),
array('msn', 'email', 'on' => 'edit', 'message' => 'MSN 格式錯誤。'),
);
}
}
on 參數區分 insert、update、edit 等場景,避免不必要的驗證干擾。safe 的屬性才能透過大量賦值(setAttributes())賦值,這是防禦惡意注入的關鍵防線。message,提升使用者體驗。