Ich habe eine Eigenschaft RecordsUserActivity genannt, die im Grunde einen Datensatz in einer Tabelle Aktivitäten erstellen, wenn ein Benutzer erstellt, aktualisiert oder löscht etwas, das dieses Merkmal verwendet. Hier ist der Code:Laravel mehrere Zuhörer für ein Modell Ereignis
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'];
}
}
Dann habe ich eine andere Eigenschaft, die Eigenschaft Änderungen in Modellen, die es verwendet. Hier ist der Code:
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' => '{}',
]);
}
}
Das Problem erscheint, wenn ich beiden Züge in einem Modell enthalten und ein Update durchgeführt wird, gibt es eine Art von Kollision mit beiden aktualisierten Modellen Ereignissen. Gibt es einen Weg, das zu beheben, oder sollte ich eine andere Lösung finden?
es funktioniert, danke! – Alan