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

时间:2017-02-08 13:30:20

标签: php mysql cakephp cakephp-2.0

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

3 个答案:

答案 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);
}