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

Posted

技术标签:

【中文标题】检测模型的变化; php yii 框架【英文标题】:Detecting changes in the model; php yii framework 【发布时间】:2013-05-17 02:01:17 【问题描述】:

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

这些基本上是我想看到的;我的审计跟踪表如下所示:

用户|时间戳|模块名称|行动|旧值|新价值|说明

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

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

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

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

我的问题在于将旧值更改为新值,即用户所做的编辑。 我可以通过逐字复制变量并将其传递给我创建日志的函数来“嗅出”他/她所做的编辑/更改。我如何动态地做到这一点?

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

afterFind 将在每次查找后进行评估,就像在网格中一样,对吧?也许场景可以用于将属性存储到 _dbValues 仅在更新时。 谢谢!这很有用:D【参考方案2】:

快速示例:

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;
    

【讨论】:

谢谢..我会试试这个【参考方案3】:

您的解决方案很好,但是如果有 2 个线程同时调用 ->save() 怎么办?

假设:

    第一个线程找到记录,保存A状态。 第二个线程找到记录,保存A状态。 然后第一个线程将记录更改为 B,调用 ->save()。系统将记录 A->B 然后第二个线程将记录更改为 C,调用 ->save()。系统将记录 A->C

总结,有 2 个日志:A->B,A->C。如果这对您来说没有问题,请忽略它并执行上述解决方案。

【讨论】:

以上是关于检测模型的变化; php yii 框架的主要内容,如果未能解决你的问题,请参考以下文章

Gii 模型生成器错误 - 表不存在 - Yii 框架和 SQL Server 2000

Play 2.1 框架未检测到进化变化

YII框架一个请求的生命周期

yii框架如何访问api

[Yii2.0] [MongoDb] [PHP] 如何在Yii框架下使用find()实现忽略大小写查询?

php--yii框架表单验证