【问题标题】:In CakePHP, beforeRender in the AppController is saving to database twice在 CakePHP 中,AppController 中的 beforeRender 两次保存到数据库
【发布时间】:2013-08-09 22:53:01
【问题描述】:

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

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

现在我只有几页。主索引页面、登录页面、注册页面、用户资料页面和用户设置页面。除了索引页面之外的所有内容都在 UserController 中进行控制,但我有一个来自登录和注册页面的重定向,因此它们的 URL 是 /login 而不是 /users/login。有趣的是,重复项不是在登录或注册页面上创建的——只是在个人资料和设置页面上。

我最初将代码放在 beforeFilter 中,我得到了 3 个相同数据的副本而不是 2 个。我也在 afterFilter 中尝试过,但我仍然得到了 2 个副本。

我应该提到,我正在更新的三个字段不在数据库的用户表中——它们有自己的表“活动”。

这是我在 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>

【问题讨论】:

  • 这与欺骗问题无关,但不要将$this-&gt;request-&gt;data 用于您的活动,因为它可能包含 POST 数据。因此,如果您的某个页面发布了表单,$this-&gt;request-&gt;data 中将有大量数据,在保存到您的activities 表时可能会导致问题。只需使用$data['User']['id'] = $this-&gt;Auth-&gt;user('id'); 等等。并通过$this-&gt;Activity-&gt;save($data); 保存
  • re: dupes : 请发布控制器并查看其中一项违规操作的代码。你在哪里打电话给requestAction()
  • @Costa,正如你所说,我将活动更改为 $data,并且我还使用控制器和个人资料页面的视图更新了帖子,这是导致重复的两个之一。
  • 对我来说似乎很好。你确定你的其他回调中没有类似的代码吗?检查 AppController 和您的控制器。
  • 我相当肯定...在我的 UserController 中根本没有使用“活动”,而我的 AppController 只有几个其他功能甚至不接近“活动”。有没有比 AppController 更好的地方来放置我想要在每个页面上发生的功能?

标签: php cakephp


【解决方案1】:

也许是因为你有类似的东西

$this->redirect(array('action' => 'index'));

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多