ThinkPHP 的「三大自動」是模型層最實用的內建特性,能大幅減少控制器樣板代碼,將業務規則集中在模型定義中。本文系統梳理三者語法、參數含義與實戰範例。
$_validate定義格式:
array(
'驗證字段', '驗證規則', '錯誤提示',
'驗證條件', '附加規則', '驗證時間'
)
| 參數 | 說明 |
|---|---|
| 驗證條件 | 0 恆驗證(默認) / 1 有值才驗證 / 2 值為空時驗證 |
| 附加規則 | regex/function/callback/confirm/equal/in/unique |
| 驗證時間 | Model::MODEL_INSERT / MODEL_UPDATE / MODEL_BOTH |
class UserModel extends Model {
protected $_validate = [
['username', 'require', '用戶名必填'],
['username', 'checkLen', '用戶名長度 5-15 位', 0, 'callback'],
['password', 'require', '密碼必填'],
['repassword', 'require', '確認密碼必填'],
['password', 'repassword', '兩次密碼不一致', 0, 'confirm'],
['createtime', 'number', '註冊時間必須為數字'],
['createip', 'email', '郵箱格式不正確'],
];
public function checkLen($data): bool {
$len = strlen($data);
return $len >= 5 && $len <= 15;
}
}
public function regadd() {
$user = D('User');
if ($user->create()) { // 自動驗證+自動完成+數據收集
if ($user->add()) $this->success('註冊成功');
else $this->error('註冊失敗');
} else {
$this->error($user->getError()); // 獲取首條失敗信息
}
}
$_auto格式:array('填充字段', '填充內容', '填充條件', '附加規則')
protected $_auto = [
['status', 1, self::MODEL_INSERT], // 新增時默認狀態 1
['password', 'md5', self::MODEL_INSERT, 'function'], // 寫入前 md5
['updatetime', 'time', self::MODEL_BOTH, 'function'], // 任操作更新時間戳
];
$_map將表單字段名映射到數據庫真實列名,解耦前後端命名差異:
protected $_map = [
'name' => 'username', // 表單 name → 數據庫 username
'pass' => 'password',
];
控制器無需修改,create() 內部自動完成映射轉換。
create() 後直接 exit 或 redirect 導致 getError() 未輸出。Runtime/ 目錄並重新登入。unique:需確保模型對應表存在唯一索引,否則全表掃描效能極差。