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

ThinkPHP 核心三大自動機制深度解析:自動驗證、自動完成、字段映射

     編輯:PHP 相關知識

概覽

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'], // 任操作更新時間戳
];
  • 填充條件:1 新增 / 2 更新 / 3 全部
  • 附加規則:function / callback / string(默認直接賦值)

三、字段映射 $_map

將表單字段名映射到數據庫真實列名,解耦前後端命名差異:

protected $_map = [
    'name'  => 'username', // 表單 name → 數據庫 username
    'pass'  => 'password',
];

控制器無需修改,create() 內部自動完成映射轉換。

常見坑位與技巧

  • 驗證失敗不顯示錯誤:檢查是否在 create() 後直接 exit 或 redirect 導致 getError() 未輸出。
  • 調試模式下緩存干擾:刪除 Runtime/ 目錄並重新登入。
  • 唯一驗證 unique:需確保模型對應表存在唯一索引,否則全表掃描效能極差。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved