2013-05-22 5 views
5

監査証跡モジュールを作成しています。私はトレイルエントリを保存するためのテーブルを作成しました。 "監査人"として、現在ログオンしているユーザー、ページの場所、実行した操作、および変更内容は何ですか?いつ...モデルの変更を検出します。 php yii framework

これは基本的に私が見たいものです。私の監査証跡表は以下のようになります:

ユーザー|タイムスタンプ|モジュール名|アクション|古い値|新しい価値|説明

は、私は基本的に取得することにより

Yii::app()->session['username']; 

ページ/モジュールとアクションにより、ユーザーを取得は問題がありませんでしたコントローラの:

私の問題は、変化にある
$this->module->getName(); 
$this->action->id; 

古い値新しい値に、ユーザーによって行われた編集。 変数を文字通りコピーし、ログを作成する私の関数に渡すことで、エディット/変更の内容を「スニッフィング」することができます。

特定のモデルのプロパティまたは属性が変更されたかどうかを検出し、変更がどのように行われたかを確認して、詳細ログを取得できるようにしたい...ありがとう!申し訳ありませんが、私は本当にこれを説明しようとしています。

答えて

8

観察したい各モデルでは、afterFind()メソッドを記述できます。このメソッドでは、現在のDB属性をいくつかのプライベート変数e.b.に格納します。 _dbValues。次にbeforeSave()で、現在の属性を_dbValuesの属性で確認し、変更があった場合は監査レコードを作成します。

この作業が完了したら、それをさらに進めてbehaviorを作成することができます。プライベート変数のafterFind()beforeSave()メソッドをそこに配置します。その後、その動作を多くのレコードに添付することができます。

+0

'afterFind'はすべての検索の後で評価されます。グリッドのように、右ですか?シナリオは、更新時にのみ属性を '_dbValues'に格納するために使用される可能性があります。 –

+0

ありがとうございます!これは便利です:D – muffin

6

クイック例: - 同時に>保存()

+0

ありがとう..私はこれを試してみる – muffin

0

あなたのソリューションは良いですが、何があった場合に、コールしている2つのスレッド? Aの状態を保存し、第一のスレッドがレコードを見つける

  1. があるとします。

  2. 2番目のスレッドのレコードを検索し、Aステータスを保存します。
  3. 次に、Bへの最初のスレッド変更レコード、call - > save()。システムはA-> Bを記録します。
  4. そして、2番目のスレッド変更レコードをC-> save()に呼び出します。システムはA-> Cをログに記録します。

要約すると、A-> B、A-> Cのログがあります。これが問題でない場合は、それを無視して上記の解決策を実行してください。

関連する問題