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

muf*_*fin 5 php audit controller model yii

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

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

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

我基本上没有问题得到用户,通过

Yii::app()->session['username'];
Run Code Online (Sandbox Code Playgroud)

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

$this->module->getName();
$this->action->id;
Run Code Online (Sandbox Code Playgroud)

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

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

Mic*_*rtl 8

在您要观察的每个模型中,您可以编写一个afterFind()方法,将当前数据库属性存储到某个私有变量中,例如_dbValues.然后在beforeSave()您使用中的属性验证当前属性,_dbValues并在有更改时创建审核记录.

完成此工作后,您可以更进一步,并从中创建一个行为.你将私有变量,方法afterFind()beforeSave()方法放在那里.然后,您可以将该行为附加到许多记录.


Val*_*sky 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;
    }
}
Run Code Online (Sandbox Code Playgroud)