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
相关产品推荐
相关产品推荐

