ThinkPHP 模型 _auto 屬性支援 function (公共函式) 與 callback (模型內部方法) 兩種自動完成模式。本文示範如何用 callback 模式在新增資料時自動寫入當前登入用戶名 (來自 Session),並釐清兩種模式的載入路徑差異。
<?php
namespace Home\Model;
use Think\Model;
class ArticleModel extends Model {
// 自動完成定義:array(欄位, 處理值, 條件, 類型)
protected $_auto = [
// 新增時:addtime 填入 time() 回傳值
['addtime', 'time', self::MODEL_INSERT, 'function'],
// 新增時:username 呼叫模型內部 getName() 方法
['username', 'getName', self::MODEL_INSERT, 'callback'],
];
/**
* 回調方法:取得當前登入用戶名
* 必須為 protected/public,不可 private
*/
protected function getName(): string {
// ThinkPHP 將 $_SESSION 封裝為 session() 函式,建議統一用法
return session('user_auth.username') ?? 'guest';
}
}
?>
| 屬性 | function | callback |
|---|---|---|
| 查找範圍 | Common/Common/function.php (專案公共函式庫) | 當前模型類別內部方法 |
| 命名衝突 | 全域函式名需唯一 | 僅限模型內部,可重名 |
| 依賴注入 | 困難 (全域狀態) | 可直接用 $this 存取模型屬性、其他方法 |
| 單元測試 | 需 Mock 全域函式 | 可 Mock 模型實例 |
| 適用場景 | 通用工具函式 (如 generate_uuid()、format_date()) | 業務相關邏輯 (如取得當前用戶、計算價格、驗證庫存) |
private → 無法被框架呼叫 (需 protected 或 public)1 代表 MODEL_INSERT,2 代表 MODEL_UPDATE,3 代表兩者皆觸發function 模式下函式未載入 → 確認 Common/Common/function.php 已被 common.php 引入或配置 AUTOLOAD_NAMESPACEsession('key') 而非直接 $_SESSION,支援前綴、驅動切換protected $_auto = [
// 只有當 username 為空時才自動填入
['username', 'getName', self::MODEL_INSERT, 'callback', 'empty'],
];
第五個參數可為 empty (值為空才處理)、notempty、或自定義回調 function($val){ return $val === 'auto'; }。
ThinkPHP 模型自動完成 業務邏輯用 callback、通用工具用 function。寫入 Session 值屬業務邏輯,直接在模型定義 protected function getName() 並配置 'callback' 即可,程式碼內聚、易測試、不汙染全域命名空間。