【问题标题】:how to run custom code after every $model->save() function in yii2如何在 yii2 中的每个 $model->save() 函数之后运行自定义代码
【发布时间】:2017-04-12 12:06:37
【问题描述】:

我想在Yii2 中的每个$model->save() 之后或之前执行我的自定义代码。

我想在全局范围内执行此操作,例如使用 components 等。

我想创建一个用户活动日志来存储用户在数据库表中插入或更新任何行的次数,因此为此我想在表中插入或更新数据时运行一些代码。

任何帮助或建议将不胜感激。

【问题讨论】:

    标签: php mysql logging yii2 yii2-basic-app


    【解决方案1】:

    正如@patryk 提到的ActiveRecordbeforeSaveafterSave 方法。

    我使用类似以下内容来存储新记录的创建日期(以及更新现有记录时的更新日期)。示例中的代码当然很简单,但它允许您使用所需的任意代码、查看布局以及如何拆分“新”记录和现有记录的代码。

    这个被覆盖的方法可以添加到任何扩展 ActiveRecord 的模型类中,以允许父 beforeSave 也被正确调用。

    /**
     * @inheritdoc
     */
    public function beforeSave($insert)
    {
        if ($insert) {
            // This is a new instance of modelClass, run your 'insert' code here.
            $this->created_date = time();
        }
        // Anything else will be run any time a model is saved.
        $this->updated_date = time();
    
        return parent::beforeSave($insert);
    }
    

    编辑添加: 如果每个模型要运行的代码都相同,您可以创建一个特征并在每个模型中使用该特征以允许您在一个地方更改行为。或者创建一个自定义的ActiveRecord 类来覆盖每个子类的beforeSave 方法。

    【讨论】:

    • 我想将它用作组件或全局函数。我有将近 80 个模型文件,我很难编辑每个文件并在那里编写这段代码。
    • @FahadAli;在那种情况下,也许是一个特征或自定义超类?
    • 你能给我一些建议吗
    【解决方案2】:

    创建扩展\yii\db\ActiveRecord的新类(MyActiveRecord)

    使用 extends MyActiveRecord 到你所有的项目模型

    例如:

    class MyActiveRecord extends \yii\db\ActiveRecord
    { 
    
     public function afterSave($insert, $changedAttributes){
        //This will called after every model saved
    
      return parent::beforeSave($insert,$changedAttributes);
     }
    
    
    
    
    }
    

    在您的项目中的其他模型

    class Customer extends app\models\MyActiveRecord
    { 
    
    
    
    }
    

    【讨论】:

    • 我想将它用作组件或全局函数。我有将近 80 个模型文件,我很难编辑每个文件并在那里编写这段代码。
    【解决方案3】:

    Yii2 ActiveRecord 类有 beforeSaveafterSave 方法。 https://github.com/yiisoft/yii2/blob/master/framework/db/BaseActiveRecord.php#L926

    但也许对数据库触发器做这样的操作会更好?

    【讨论】:

      猜你喜欢
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 2019-03-22
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2014-05-02
      相关资源
      最近更新 更多