我正在创建一个审计跟踪模块,我将放入一个更大的系统;我创建了一个表来存储跟踪条目,作为“审计员”我想看到当前登录的用户,他/她所在的页面,他/她做了什么动作,以及改变了什么什么时候......
这些基本上就是我想看到的;我的审计跟踪表看起来像:用户|时间戳|模块名称|动作|旧价值|新价值|描述
我基本上没有问题来获取用户
Yii::app()->session['username'];
获取控制器的页面/模块和操作:
$this->module->getName();
$this->action->id;
我的问题在于将旧值更改为新值,用户完成的修改。 我可以通过字面复制变量并将其传递给我创建日志的函数来“嗅出”他/她所做的编辑/更改。我如何动态地执行此操作?
我想检测某个模型的属性或属性是否已更改并查看所做的更改,以便我可以获得详细日志...谢谢!对不起,我真的很努力解释这一点。
答案 0 :(得分:8)
在您要观察的每个模型中,您可以编写afterFind()
方法,将当前数据库属性存储到某个私有变量中,例如: _dbValues
。然后在beforeSave()
中使用_dbValues
中的属性验证当前属性,并在发生更改时创建审核记录。
完成此工作后,您可以更进一步,从中创建behavior。您将私有变量afterFind()
和beforeSave()
方法放在那里。然后,您可以将该行为附加到许多记录。
答案 1 :(得分:6)
快速举例:
class Book extends CActiveRecord
{
private $oldAttrs = array();
public static function model($className = __CLASS__)
{
return parent::model($className);
}
public function tableName()
{
return 'book';
}
protected function afterSave()
{
// store history
if (!$this->isNewRecord) {
$newAttrs = $this->getAttributes();
$oldAttrs = $this->getOldAttributes();
// your code
}
return parent::afterSave();
}
protected function afterFind()
{
// Save old values
$this->setOldAttributes($this->getAttributes());
return parent::afterFind();
}
public function getOldAttributes()
{
return $this->oldAttrs;
}
public function setOldAttributes($attrs)
{
$this->oldAttrs = $attrs;
}
}
答案 2 :(得分:0)
你的解决方案很好,但是如果有两个线程同时调用 - > save()怎么办?
假设: