2017-02-08 4 views
1

私はcakephp 2.6を使用しています。現在ログインしているユーザーがウェブサイトのURLをヒットするたびに、データベーステーブルの列「last_request」を更新する必要があります。 cakePHPが新しくなったので、共通のコード(例:コンポーネントなど)を実装できる場所を教えてください。そうすれば、すべての要求を各関数またはコントローラからそのコードを特に呼び出すことなく管理できるようになります。おかげさまで 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

あなたは、私は、テーブル名が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は、この関数を呼び出していることを、ここで想定してテーブル

に関連付けられているModelでそれを行うことができます適切な使用方法

AppControllerから

public function afterFilter(){ // afterRender 
    //Set the variable $value 
    $userModel = ClassRegistry::init('User'); 
    $userModel->updateLastHit($this->Auth->user('id'), $value); 
} 
+3

これは、OPがしなければならないことを正確に行うことを必要とします。 – Dave

+0

あなたは正しいですDave、私はあなたと@Manoharの答えに基づいて私の答えを更新しました。 –

+0

誤った回答を変更して、他の人が作成した別の既存の回答を反映させることはできません。 – Dave

2

あなたのAppControllerにafterFilter()メソッドを追加したいと思うでしょう。 (details here

afterFilter:すべてのコントローラのアクション後に呼び出さ、レンダリング後には完了です。これは最後に実行するコントローラーメソッドです。

より前にコードを更新したい場合は、beforeFilter()を使用することもできます。Request-Lifcycle callbacksのいずれかを使用できます。

次に、ユーザーモデルに、希望する操作を行うメソッドを追加できます(ユーザーの行をlast_requestフィールドで更新)。

afterFilter()メソッドで、Userモデルがロードされていることを確認してから、そのメソッドを呼び出します。リクエストごとにafterFilterがトリガーされ、モデルのコードが実行されます。

関連する問題