Я использую cakephp 2.6, у меня есть сценарий, когда мне нужно обновить столбец таблицы базы данных «last_request» всякий раз, когда текущий пользователь loggedin ударил по любому URL-адресу веб-сайта. Я новичок в cakePHP. Пожалуйста, предложите мне, где я могу реализовать общий код (для ex: component и т. Д.), Чтобы можно было управлять всем запросом, не вызывая этот код конкретно от каждой функции или контроллера. Спасибо.CakePHP добавить общий код для каждого запроса
ответ
Ответ, предложенный @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.
Вы можете сделать это в 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);
}
Это потребовало бы выполнения именно того, что ОП не требовало: называть его в каждом действии. – Dave
Вы правы, Дейв, я только что обновил свой ответ на основе вашего ответа и ответа @Manohar. –
Неправильная практика - изменить неправильный ответ, чтобы отразить другой существующий ответ, созданный кем-то другим. – Dave
Вы хотите добавить метод afterFilter()
в свой AppController. (details here)
afterFilter: Вызывается после каждого действия контроллера, и после завершения рендеринга. Это последний способ управления контроллером.
Возможно, вы использовали опцию beforeFilter(), если вы предпочтете обновление кода ранее или один из других Request-Lifcycle callbacks.
Затем вы можете добавить метод в модель пользователя, который будет делать то, что вы хотите (обновите строку пользователя с помощью поля last_request
).
В методе afterFilter() убедитесь, что модель пользователя загружена, а затем вызовите его метод. После каждого запроса будет активирован afterFilter, и код вашей модели будет запущен.
Это хорошее возможное решение, в зависимости от потребностей проекта, но, если я ошибаюсь, будет срабатывать только на действия, которые еще не «разрешены», а не «все» действия, такие как OP. Просто что-то для людей, о которых нужно помнить. Но мне нравится это как ответ, чтобы продолжить этот вопрос, поскольку это, безусловно, может помочь будущим разработчикам, и я уверен, это то, что некоторые люди захотят использовать. – Dave
Да Спасибо большое. – Aamir