Я новичок в 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>
Это не относится к проблеме обмана, но не использует '$ this-> request-> data' для ваших действий, потому что может содержать данные POST. Поэтому, если одна из ваших страниц отправляет форму, в '$ this-> request-> data будет много данных, что может вызвать проблемы при сохранении в вашей таблице действий. Просто используйте '$ data ['User'] ['id'] = $ this-> Auth-> user ('id');' и так далее. И сохраните через '$ this-> Activity-> save ($ data);' – Costa
re: dupes: пожалуйста, разместите контроллер и просмотрите код для одного из действий с нарушением. Вы вызываете 'requestAction()' где угодно? – Costa
@Costa, я изменил действия только на $ data, как вы сказали, и я также обновил сообщение с контроллером и просмотрел страницу профиля, которая является одним из двух, вызывающих дубликаты. – user2655021