我有一个名为RecordsUserActivity的特性,它基本上在用户创建,更新或删除使用此特征的某些内容时在活动表中创建一条记录。这里是代码:Laravel模型事件的多个侦听器
trait RecordsUserActivity
{
protected static function boot()
{
parent::boot();
foreach (static::getModelEvents() as $event) {
static::$event(function ($model) use ($event) {
$model->addActivity($event);
});
}
}
protected function addActivity($event)
{
$newActivity = [
'subject_id' => $this->id,
'subject_type' => get_class($this),
'action' => $event,
'user_id' => (Auth::id()) ?? null,
];
if ($event == 'updated') {
$newActivity['data'] = json_encode($this->getDirty());
}
UserActivity::create($newActivity);
}
protected static function getModelEvents()
{
if (isset(static::$recordEvents)) {
return static::$recordEvents;
}
return ['created', 'deleted', 'updated'];
}
}
然后,我有另一个特性,记录使用它的模型的属性更改。下面是代码:
trait RecordsPropertyChangelog
{
protected static function boot()
{
parent::boot();
static::updated(function ($model){
$model->addPropertiesChangelog();
});
}
protected function addPropertiesChangelog()
{
$dirty = $this->getDirty();
foreach ($dirty as $field => $newData) {
$oldData = $this->getOriginal($field);
$this->addPropertyChangelog($field,$oldData,$newData);
}
}
protected function addPropertyChangelog($fieldName,$oldValue,$newValue)
{
PropertyChangelog::create([
'resource_id' => $this->id,
'resource_type' => get_class($this),
'property' => $fieldName,
'from_value' => $oldValue,
'to_value' => $newValue,
'data' => '{}',
]);
}
}
当我包括模型两个性状出现的问题和更新而成,有某种既更新模型事件发生碰撞。有没有办法解决这个问题,或者我应该找出另一种解决方案?
它的工作原理,谢谢! – Alan