2017-02-08 15 views
1

Я использую cakephp 2.6, у меня есть сценарий, когда мне нужно обновить столбец таблицы базы данных «last_request» всякий раз, когда текущий пользователь loggedin ударил по любому URL-адресу веб-сайта. Я новичок в cakePHP. Пожалуйста, предложите мне, где я могу реализовать общий код (для ex: component и т. Д.), Чтобы можно было управлять всем запросом, не вызывая этот код конкретно от каждой функции или контроллера. Спасибо.CakePHP добавить общий код для каждого запроса

ответ

1

Ответ, предложенный @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.

+1

Это хорошее возможное решение, в зависимости от потребностей проекта, но, если я ошибаюсь, будет срабатывать только на действия, которые еще не «разрешены», а не «все» действия, такие как OP. Просто что-то для людей, о которых нужно помнить. Но мне нравится это как ответ, чтобы продолжить этот вопрос, поскольку это, безусловно, может помочь будущим разработчикам, и я уверен, это то, что некоторые люди захотят использовать. – Dave

+0

Да Спасибо большое. – Aamir

-2

Вы можете сделать это в 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); 
} 
+3

Это потребовало бы выполнения именно того, что ОП не требовало: называть его в каждом действии. – Dave

+0

Вы правы, Дейв, я только что обновил свой ответ на основе вашего ответа и ответа @Manohar. –

+0

Неправильная практика - изменить неправильный ответ, чтобы отразить другой существующий ответ, созданный кем-то другим. – Dave

2

Вы хотите добавить метод afterFilter() в свой AppController. (details here)

afterFilter: Вызывается после каждого действия контроллера, и после завершения рендеринга. Это последний способ управления контроллером.

Возможно, вы использовали опцию beforeFilter(), если вы предпочтете обновление кода ранее или один из других Request-Lifcycle callbacks.

Затем вы можете добавить метод в модель пользователя, который будет делать то, что вы хотите (обновите строку пользователя с помощью поля last_request).

В методе afterFilter() убедитесь, что модель пользователя загружена, а затем вызовите его метод. После каждого запроса будет активирован afterFilter, и код вашей модели будет запущен.