检测模型的变化; php yii框架

时间:2013-05-22 06:10:22

标签: php model yii controller audit

我正在创建一个审计跟踪模块,我将放入一个更大的系统;我创建了一个表来存储跟踪条目,作为“审计员”我想看到当前登录的用户,他/她所在的页面,他/她做了什么动作,以及改变了什么什么时候......

这些基本上就是我想看到的;我的审计跟踪表看起来像:

用户|时间戳|模块名称|动作|旧价值|新价值|描述

我基本上没有问题来获取用户

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

获取控制器的页面/模块和操作:

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

我的问题在于将旧值更改为新值,用户完成的修改。 我可以通过字面复制变量并将其传递给我创建日志的函数来“嗅出”他/她所做的编辑/更改。我如何动态地执行此操作?

我想检测某个模型的属性或属性是否已更改并查看所做的更改,以便我可以获得详细日志...谢谢!对不起,我真的很努力解释这一点。

3 个答案:

答案 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()怎么办?

假设:

  1. 第一个帖子查找记录,保存A状态。
  2. 第二个线程查找记录,保存A状态。
  3. 然后第一个线程更改记录到B,调用 - > save()。系统将记录A-> B
  4. 然后第二个线程更改记录到C,调用 - > save()。系统将记录A-> C
  5. 总之,有2个对数:A-> B,A-> C.如果这不是问题,请忽略它并执行上述解决方案。