2013-05-22 32 views
5

我正在創建一個審計跟蹤模塊,我將把它放在一個更大的系統中;我創建了一張表來存儲路徑條目,作爲「審計員」,我想查看當前登錄的用戶,他/她所在的頁面,他/她做了什麼操作以及哪些操作發生了變化當...檢測模型中的更改; php yii框架

這些基本上是我想看到的;我的審計線索表如下所示:

用戶|時間戳|模塊名稱|動作|舊值|新價值|說明

我基本沒問題,獲得用戶,通過

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

頁/模塊和行動通過獲取控制器:

$this->module->getName(); 
$this->action->id; 

我的問題在於改變舊值以新值,由用戶完成的編輯。 我可以通過字面上複製變量並將其傳遞給我的函數來「嗅出」他/她做了哪些編輯/更改,在哪裏創建日誌..我如何動態地執行此操作?

我有點想要檢測某個模型的屬性或屬性是否已經改變,看看有什麼變化,以便我可以得到詳細日誌...謝謝!對不起,我真的很難解釋這一點。

回答

8

在您想要觀察的每個模型中,您可以編寫一個afterFind()方法,將當前DB屬性存儲到某個專用變量e.b.中。 _dbValues。然後在beforeSave()中,驗證_dbValues中的當前屬性,並在出現更改時創建審覈記錄。

完成此項工作後,您可以進一步操作並從中創建一個behavior。你會把私有變量afterFind()beforeSave()方法放在那裏。然後,您可以將該行爲附加到多條記錄。

+0

'afterFind'將在每次查找後進行評估,就像在網格中一樣,對吧?也許只有在更新時纔可以使用場景來將屬性存儲到'_dbValues'。 – 2013-05-22 08:55:22

+0

謝謝!這很有用:D – muffin

6

簡單的例子:

+0

謝謝..我會試試這個 – muffin

0

你的解決方案是好的,但如果是有2個線程調用 - >保存()在同一時間?

假設:

  1. 一號線找到記錄,保存的一個狀態。
  2. 第二個線程查找記錄,保存A狀態。
  3. 然後第一個線程將記錄更改爲B,調用 - > save()。系統會記錄A-> B
  4. 然後第二個線程更改記錄到C,調用 - > save()。系統會記錄A-> C

總結,有2個日誌:A-> B,A-> C。如果這對你沒有問題,只要忽略它並執行上述解決方案。