【发布时间】:2017-04-12 12:06:37
【问题描述】:
我想在Yii2 中的每个$model->save() 之后或之前执行我的自定义代码。
我想在全局范围内执行此操作,例如使用 components 等。
我想创建一个用户活动日志来存储用户在数据库表中插入或更新任何行的次数,因此为此我想在表中插入或更新数据时运行一些代码。
任何帮助或建议将不胜感激。
【问题讨论】:
标签: php mysql logging yii2 yii2-basic-app
我想在Yii2 中的每个$model->save() 之后或之前执行我的自定义代码。
我想在全局范围内执行此操作,例如使用 components 等。
我想创建一个用户活动日志来存储用户在数据库表中插入或更新任何行的次数,因此为此我想在表中插入或更新数据时运行一些代码。
任何帮助或建议将不胜感激。
【问题讨论】:
标签: php mysql logging yii2 yii2-basic-app
正如@patryk 提到的ActiveRecord 有beforeSave 和afterSave 方法。
我使用类似以下内容来存储新记录的创建日期(以及更新现有记录时的更新日期)。示例中的代码当然很简单,但它允许您使用所需的任意代码、查看布局以及如何拆分“新”记录和现有记录的代码。
这个被覆盖的方法可以添加到任何扩展 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 方法。
【讨论】:
创建扩展\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
{
}
【讨论】:
Yii2 ActiveRecord 类有 beforeSave 和 afterSave 方法。 https://github.com/yiisoft/yii2/blob/master/framework/db/BaseActiveRecord.php#L926
但也许对数据库触发器做这样的操作会更好?
【讨论】: