CakePHP 为每个请求添加公共代码

CakePHP add common code for each request

我正在使用 cakephp 2.6,我有一个场景,每当当前登录用户点击网站的任何 url 时,我都必须更新数据库 table 列 "last_request"。 我是 cakePHP 的新手,请建议我在哪里可以实现通用代码(例如:组件等),以便可以管理所有请求,而无需从每个函数或控制器中专门调用该代码。 谢谢。

您可以在与您的 table

关联的 Model 中完成

我这里假设 table 名字是 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);
} 

您需要向 AppController 添加一个 afterFilter() 方法。 (details here)

afterFilter: Called after every controller action, and after rendering is complete. This is the last controller method to run.

如果您希望代码更早更新或使用其他方法之一,您可以选择使用 beforeFilter() Request-Lifcycle callbacks

然后,您可以在用户模型中添加一个方法来执行您想要的操作(使用 last_request 字段更新用户的行)。

在 afterFilter() 方法中,确保加载了 User 模型,然后调用它的方法。每次请求后,afterFilter 将被触发,您的模型代码将是 运行.

@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 完成。