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

ThinkPHP 模型自動完成進階:回調方法實現 Session 值自動賦值

     編輯:PHP 相關知識

場景

新增文章時,自動寫入 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 (其他欄位值)

function vs callback 差異

<?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'], // 更新時自動刷新
];

常見坑點

  1. Session 未啟動:確保入口檔或配置 'SESSION_AUTO_START'=>true。
  2. 回調方法可見性:必須 public 或 protected,private 會失效。
  3. create() 失敗:自動驗證 _validate 不通過時,create() 回傳 false,自動完成不執行。
  4. 類型錯誤:function 對應 PHP 函數/靜態方法,callback 對應實例方法,別搞混。

ThinkPHP 5/6 遷移提示

新版採用 Observer 或 事件 機制:

<?php
// TP6 寫法
class Article extends Model {
    protected static function onBeforeInsert($model) {
        $model->addtime = time();
        $model->username = session('user_auth.username') ?? 'system';
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved