2013-08-09 3 views
1

Я новичок в CakePHP, поэтому я все еще изучаю много поведения и все такое. Один, с которым я пытаюсь найти решение, - это тот факт, что у меня есть код в AppController, используя beforeRender. Код сохраняет идентификатор пользователя, его IP-адрес и текущее время загрузки страницы в базу данных для записи активности.В CakePHP beforeRender в AppController дважды записывается в базу данных

Я получаю довольно любопытный результат, и хотя я искал ответ, я не смог его найти. При загрузке страницы, управляемой другим контроллером (в данном случае UserController), он сохраняет данные в базе данных, а также в точном дубликате.

Сейчас у меня всего несколько страниц. Главная страница индекса, страница входа, страница регистрации, страница профиля пользователя и страница настроек пользователя. Все, кроме индексной страницы, контролируется в UserController, но у меня есть перенаправление со страниц входа и регистрации, поэтому их URL-адреса являются/login вместо/users/login. Интересно, что дубликаты не создаются на страницах входа или регистрации - только на странице профиля и настроек.

Я первоначально разместил код в beforeFilter, и у меня было 3 копии тех же данных вместо 2. Я также пробовал его в afterFilter, но у меня все еще есть 2 копии.

Следует отметить, что три поля, которые я обновляю, не находятся в таблице «Пользователи» в базе данных - у них есть своя таблица «Действия».

Это мой beforeRender код в AppController:

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> 
+0

Это не относится к проблеме обмана, но не использует '$ this-> request-> data' для ваших действий, потому что может содержать данные POST. Поэтому, если одна из ваших страниц отправляет форму, в '$ this-> request-> data будет много данных, что может вызвать проблемы при сохранении в вашей таблице действий. Просто используйте '$ data ['User'] ['id'] = $ this-> Auth-> user ('id');' и так далее. И сохраните через '$ this-> Activity-> save ($ data);' – Costa

+0

re: dupes: пожалуйста, разместите контроллер и просмотрите код для одного из действий с нарушением. Вы вызываете 'requestAction()' где угодно? – Costa

+0

@Costa, я изменил действия только на $ data, как вы сказали, и я также обновил сообщение с контроллером и просмотрел страницу профиля, которая является одним из двух, вызывающих дубликаты. – user2655021

ответ

0

Возможно, это так e у вас есть что-то вроде

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

в вашем контроллере. Когда загружается индексная страница, функция beforeRender вызывается снова.

Смежные вопросы