我正在使用cakephp 2.6,我有一个场景,每当当前登录用户点击网站的任何网址时,我都必须更新数据库表列“last_request”。 我是CakePHP的新手,请建议我在哪里可以实现公共代码(例如:组件等),这样就可以管理所有请求,而无需专门从每个函数或控制器调用该代码。 感谢。
答案 0 :(得分:2)
您想要在AppController中添加afterFilter()
方法。 (details here)
afterFilter:在每个控制器操作后调用,并在渲染完成后调用。这是最后一个运行的控制器方法。
您可以选择使用beforeFilter(),如果您之前更新代码或其他Request-Lifcycle callbacks之一。
然后,您可以在用户模型中添加一个可以执行所需操作的方法(使用last_request
字段更新用户的行)。
在afterFilter()方法中,确保已加载用户模型,然后调用它的方法。每次请求后,都会触发afterFilter,并运行您的模型代码。
答案 1 :(得分:1)
@ Dave建议的答案,@ Ayaou提供的最佳解决方案和答案可能与代码重复的可能性相去甚远。
我想分享的是这些事情可以通过Authorization内完成 AppController也是如此。
public function isAuthorized($user)
{
$userTable = ClassRegistry::init('User');
$data = ['last_request' => $last_request_data];
$userTable->id = $user['id'];
$userTable->save($data);
}
同样的事情也可以通过afterFilter完成。
答案 2 :(得分:-2)
您可以在与表格相关联的Model
我在此假设表名为users
<?php
class User extends AppModel{
public function updateLastHit($id, $value){
$lastID = $this->id;
$this->id = $id;
$result = $this->saveField('last_hit', $value);
$this->id = $lastID;
return $result;
}
}
然后在控制器动作逻辑完成时调用此函数,afterFilter
是适当的使用方法
来自AppController
例如
public function afterFilter(){ // afterRender
//Set the variable $value
$userModel = ClassRegistry::init('User');
$userModel->updateLastHit($this->Auth->user('id'), $value);
}