在CakePHP中,AppController中的beforeRender将数据库保存两次

时间:2013-08-09 22:53:02

标签: php cakephp

我是CakePHP的新手,所以我还在学习很多行为和一切。我正在努力寻找解决方案的事实是我在AppController中使用beforeRender的代码。代码将用户的ID,IP地址以及页面加载的当前时间保存到数据库中,以便记录活动。

我得到了一个相当好奇的结果,虽然我已经四处寻找答案但我找不到它。在加载由另一个控制器(在本例中为UserController)控制的页面时,它将数据保存到数据库以及完全重复。

现在我只有几页。主索引页面,登录页面,注册页面,用户配置文件页面和用户设置页面。除了索引页面之外的所有内容都在UserController中进行控制,但我从登录页面和注册页面进行了重定向,因此它们的URL是/ login而不是/ users / login。有趣的是,重复项不会在登录页面或注册页面上创建 - 只需在配置文件和设置页面上创建。

我最初把代码放在beforeFilter中,我得到了3份相同的数据而不是2份。我也在afterFilter中尝试了它,但我仍然有2份。

我应该提一下,我正在更新的三个字段不在数据库的Users表中 - 它们有自己的表'Activities'。

这是我在AppController中的beforeRender代码:

public function beforeRender() {
    if ($user = $this->Session->read('Auth.User')) {
        $this->loadModel('User');
        $this->loadModel('Activity');
        $data['User']['id'] = $this->Auth->user('id');
        $data['Activity']['user_ip'] = $this->request->clientIp();
        $data['Activity']['user_id'] = $data['User']['id'];
        $data['Activity']['last_activity'] = date("Y-m-d H:i:s");
        $this->Activity->save($data);
    }
}

每个请求,这是“个人资料”页面的控制器操作,其中一个导致重复:

public function profile($id = null) {
        $this->loadModel('User');
        $this->User->id = $id;
        $this->request->data['User']['id'] = $this->Auth->user('id');
        if (!$this->User->exists()) {
            throw new NotFoundException(__('User not found'));
        }
        $user = $this->User->findById($id);
        if (!$user) {
        throw new NotFoundException(__('User not found'));
        }
        $this->set('user', $this->User->read(null, $id));
        $this->set('title_for_layout', $user['User']['screenname'] . "'s" . ' ' . 'Profile');
    }

个人资料页面的视图(主要是基本的HTML):

<?php echo $this->Html->css('profile');  ?>

<h2><?php echo h($user['User']['screenname']); ?></h2>

<center><table cellpadding="6">
<tr><center>
    <td><center><div class="ha_image"></div>
    </td>
    <td><center><h4>User Information</h4>
    <div class="user_info">
        <table class="">
            <tr>
                <td class="stats_names">
                    Member Type
                </td>
                <td class="stats_stats">
                    --
                </td>
            </tr>
            <tr>
                <td class="stats_names">
                    Member Since
                </td>
                <td class="stats_stats">
                    <?php echo date('M jS, Y', strtotime($user['User']['created'])); ?>
                </td>
            </tr>
            <tr>
                <td class="stats_names">
                    Last Active
                </td>
                <td class="stats_stats">
                    <?php echo date('M j, Y h:i A', strtotime($user['User']['last_active'])); ?>
                </td>
            </tr>
            <tr>
                <td class="laststats_names">
                    Status
                </td>
                <td class="laststats_stats">

                </td>
            </tr>
            <tr>
                <td class="stats_names">
                    Totals
                </td>
                <td class="stats_stats">
                    --
                </td>
            </tr>
            <tr>
                <td class="stats_names">
                    Forum Posts
                </td>
                <td class="stats_stats">
                    --
                </td>
            </tr>
            <tr>
                <td class="stats_names">
                    Achievements
                </td>
                <td class="stats_stats">
                    --
                </td>
            </tr>
            <tr>
                <td class="laststats_names">
                    Quests Done
                </td>
                <td class="laststats_stats">
                    --
                </td>
            </tr>
        </table>

1 个答案:

答案 0 :(得分:0)

也许是因为你有像

这样的东西
$this->redirect(array('action' => 'index'));

在您的控制器中。当索引页面加载时,再次调用beforeRender函数。