2017-02-08 60 views
1

我使用CakePHP 2.6,我有這樣一個場景,我要更新的數據庫表列「last_request」每當當前的loggedIn用戶打到網站的任何網址。 我是cakephP的新手,請告訴我可以在哪裏實現公共代碼(例如:組件等),以便所有請求都可以在不從每個功能或控制器調用特定代碼的情況下進行管理。 謝謝。CakePHP的添加常用代碼爲每個請求

回答

1

回答@戴夫認爲,可能是最好的解決方案,並解答@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

後過濾器:每個控制器動作後調用,以及渲染完成後。這是最後一個要運行的控制器方法。

如果您希望代碼更早更新或者其他Request-Lifcycle callbacks之一,您可以選擇使用beforeFilter()。

然後,您可以添加在您的用戶模型的方法,將你想要做什麼(與last_request場更新用戶的行)。

在後過濾器()方法,確保用戶模型加載,然後調用它的方法。在每次請求之後,afterFilter將被觸發,並且模型的代碼將被運行。