ThinkPHP 模型的 _auto 自動完成機制支持在數據寫入前自動填充字段。本文演示如何在文章模型中自動完成 addtime(時間戳)與 username(Session 中的用戶名),並深度解析 function 與 callback 兩種調用模式的區別與適用場景。
<?php
class ArticleModel extends Model {
// 自動完成定義:array(字段, 填充內容, 條件, 類型)
protected $_auto = array(
// 新增時自動填充時間戳
array('addtime', 'time', 1, 'function'),
// 新增時自動填充 Session 中的用戶名
array('username', 'getName', 1, 'callback'),
);
// 回調方法:獲取 Session 值
protected function getName() {
return isset($_SESSION['name']) ? $_SESSION['name'] : '';
}
}
?>
| 類型 | 參數值 | 查找範圍 | 適用場景 | 示例 |
|---|---|---|---|---|
| function | 函數名字符串 | Common/common.php 全局函數庫 | 通用工具函數(如 time、md5、自定義 get_client_ip) | array('addtime', 'time', 1, 'function') |
| callback | 方法名字符串 | 當前模型類 的 protected/public 方法 | 依賴模型上下文、需訪問 $this、Session、請求對象的業務邏輯 | array('username', 'getName', 1, 'callback') |
1:新增時(create() 且無主鍵值);2:更新時(create() 且有主鍵值);3:新增與更新均執行。array('ip', 'get_client_ip', 1, 'function') 會調用 get_client_ip() 返回值填充;protected function getName($data) { ... },$data 為當前要寫入的數據數組;session_start(),且 Session 鍵名一致;_auto,改用 insert/update 事件或修改器 setAttr,邏輯相似但語法不同。<?php
class CartTool {
private static $ins = null;
private $items = [];
// 單例模式
final protected function __construct() {}
final protected function __clone() {}
public static function getIns() {
return self::$ins ?: (self::$ins = new self());
}
// 綁定 Session
public static function getCart() {
if (!isset($_SESSION['cart']) || !($_SESSION['cart'] instanceof self)) {
$_SESSION['cart'] = self::getIns();
}
return $_SESSION['cart'];
}
// 添加商品
public function addItem($id, $name, $price, $brand, $thumb, $num = 1) {
if ($this->hasItem($id)) {
$this->incNum($id, $num);
return;
}
$this->items[$id] = compact('id', 'name', 'price', 'brand', 'thumb', 'num');
return $this->items[$id];
}
// ... incNum, modNum, delItem, getItems, getTotal 等方法
}
?>
function 指向全局函數庫,callback 指向模型自身方法;callback,因需訪問 $_SESSION 且屬業務邏輯;善用自動完成,能大幅減少控制器樣板代碼,保持模型職責清晰。