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

ThinkPHP 模型自動完成:回調函式寫入 Session 值實戰

     編輯:PHP 綜合知識

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 vs callback 差異對照

屬性functioncallback
查找範圍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_NAMESPACE
  • ✅ 取 Session 建議用 session('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' 即可,程式碼內聚、易測試、不汙染全域命名空間。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved