You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter4中如何通过BaseController统一更新用户last_seen字段

在BaseController中统一更新用户last_seen字段的方案

既然所有业务控制器都继承自BaseController,完全可以在这个基类的核心入口逻辑里一次性实现需求,不用逐个方法重复写代码,具体可以这么做:

方法一:利用BaseController的构造函数

在BaseController的构造函数中加入登录检查与字段更新逻辑——所有子类控制器实例化时都会先执行父类的构造函数,这样就能覆盖所有页面请求场景:

class BaseController {
    public function __construct() {
        // 保留原有构造逻辑(如果有的话)
        
        // 检查用户登录状态
        if (is_loggedin()) {
            // 获取当前登录用户ID(替换成你实际获取用户ID的方法)
            $user_id = get_current_logged_user_id();
            // 更新last_seen为当前时间
            $current_time = date('Y-m-d H:i:s');
            // 执行数据库更新(替换成你的实际数据库操作代码)
            db()->update('users', ['last_seen' => $current_time], ['id' => $user_id]);
        }
    }
}

方法二:添加统一的前置处理方法

如果你的框架推荐使用专门的前置方法处理请求前逻辑(比如部分框架有beforeAction这类约定方法),可以在BaseController中定义该方法并确保子类自动执行:

class BaseController {
    public function __construct() {
        // 原有构造逻辑
        $this->beforeAction();
    }

    protected function beforeAction() {
        if (is_loggedin()) {
            $user_id = get_current_logged_user_id();
            $current_time = date('Y-m-d H:i:s');
            db()->update('users', ['last_seen' => $current_time], ['id' => $user_id]);
        }
    }
}

额外优化:可选关闭机制

如果某些控制器不需要更新last_seen,可以在BaseController中加一个开关属性,让子类按需关闭:

class BaseController {
    // 默认开启更新
    protected $update_last_seen = true;

    public function __construct() {
        if ($this->update_last_seen && is_loggedin()) {
            $user_id = get_current_logged_user_id();
            $current_time = date('Y-m-d H:i:s');
            db()->update('users', ['last_seen' => $current_time], ['id' => $user_id]);
        }
    }
}

// 不需要更新的控制器示例
class NoNeedUpdateController extends BaseController {
    protected $update_last_seen = false;
}

内容的提问来源于stack exchange,提问作者Vpp Man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:22:34