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

CakePHP 4 登录时更新用户最后登录时间字段报错如何解决

错误原因

CakePHP 4 已废弃旧版 Auth 组件,你当前使用的是新的 Authentication 插件,未加载旧 Auth 组件的前提下 $this->Auth 本身为 null,调用 user() 方法自然会触发报错。

修复方案

你已经通过 $this->Authentication->getResult() 拿到了身份验证结果,且已经通过 $result->isValid() 判断登录有效,直接从验证结果中取出用户数据即可,无需额外查询用户表,优化后的完整代码如下:

public function login()
{
    $this->request->allowMethod(['get', 'post']);
    $result = $this->Authentication->getResult();
    // 无论GET还是POST请求,用户已登录就直接跳转
    if ($result->isValid()) {
        $redirect = $this->request->getQuery('redirect', [
            'controller' => 'Pages',
        ]);
        // 更新最后登录时间逻辑
        $usersTable = $this->getTableLocator()->get('Users');
        // 直接从验证结果取用户对象,无需二次查询
        $user = $result->getData();
        $user->last_login = date('Y-m-d H:i:s');
        $usersTable->save($user);
        // 跳转逻辑
        return $this->redirect($redirect);
    }
    // POST请求且登录失败提示错误
    if ($this->request->is('post') && !$result->isValid()) {
        $this->Flash->error(__('Invalid username or password'));
    }
}

注意事项

如果执行保存时报错,检查 src/Model/Entity/User.php 实体类中,是否已经把 last_login 加入 $_accessible 属性允许批量赋值:

protected $_accessible = [
    // 其他已配置的字段
    'last_login' => true,
];

不想修改实体配置的话,也可以在调用save方法时临时指定允许更新的字段:

$usersTable->save($user, ['accessibleFields' => ['last_login' => true]]);

内容的提问来源于stack exchange,提问作者Chauncey Starkey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:54:00