如何在yii2中的每个$ model-> save()函数之后运行自定义代码

时间:2017-04-12 12:06:38

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

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

我希望像使用components

一样全局执行此操作

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

任何帮助或建议都会受到赞赏。

3 个答案:

答案 0 :(得分: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方法。

答案 1 :(得分:1)

创建扩展\ yii \ db \ ActiveRecord

的新类(MyActiveRecord)

将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
{ 



}

答案 2 :(得分:0)

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

但也许在数据库触发器上进行此类操作会更好?