新增文章時,自動寫入 addtime (時間戳) 與 username (當前登入用戶,存於 Session)。
<?php
namespace Home\Model;
use Think\Model;
class ArticleModel extends Model {
// 自動完成規則:array(欄位, 規則, 條件, 類型)
protected $_auto = [
// 新增時 (1) 自動填入 time() 回傳值,類型 function 表示呼叫 PHP 內建函數
['addtime', 'time', self::MODEL_INSERT, 'function'],
// 新增時呼叫本模型的 getName() 方法,類型 callback
['username', 'getName', self::MODEL_INSERT, 'callback'],
];
// 回調方法:必須為 protected/public
protected function getName(): string {
// 直接讀取 Session (ThinkPHP 已啟動 session)
return session('user_auth.username') ?? 'system';
}
}
| 參數位置 | 名稱 | 說明 |
|---|---|---|
| 第 1 | 欄位名 | 資料表欄位 |
| 第 2 | 規則 | 函數名、方法名、或固定值 |
| 第 3 | 條件 | self::MODEL_INSERT (1) 新增、self::MODEL_UPDATE (2) 更新、self::MODEL_BOTH (3) 兩者 |
| 第 4 | 類型 | function (PHP 函數/靜態方法)、callback (本模型實例方法)、field (其他欄位值) |
<?php
// function:去 Common/common.php 找函數
['ip', 'get_client_ip', 1, 'function'];
// callback:呼叫 $this->get_client_ip() (模型實例方法)
['ip', 'getClientIp', 1, 'callback'];
<?php
$Article = D('Article'); // 實例化模型 (支援自動完成)
$data = [
'title' => $_POST['title'],
'content' => $_POST['content'],
// addtime、username 會自動填入,無需手動傳遞
];
if ($Article->create($data)) {
$id = $Article->add();
$this->success('發布成功', U('index'));
} else {
$this->error($Article->getError());
}
<?php
protected $_auto = [
// 只有當欄位為空時才自動填入
['addtime', 'time', 1, 'function'],
['update_time', 'time', 2, 'function'], // 更新時自動刷新
];
'SESSION_AUTO_START'=>true。public 或 protected,private 會失效。_validate 不通過時,create() 回傳 false,自動完成不執行。function 對應 PHP 函數/靜態方法,callback 對應實例方法,別搞混。新版採用 Observer 或 事件 機制:
<?php
// TP6 寫法
class Article extends Model {
protected static function onBeforeInsert($model) {
$model->addtime = time();
$model->username = session('user_auth.username') ?? 'system';
}
}