ModelChangeDetector.php 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. <?php
  2. namespace App\Services\History;
  3. use App\Models\Enums\ActionObjectType;
  4. use Illuminate\Database\Eloquent\Model;
  5. class ModelChangeDetector
  6. {
  7. public static function detector(ActionObjectType $objectType, Model $model): array
  8. {
  9. $detector = $objectType->detectorClassName();
  10. if (! $detector) {
  11. return [];
  12. }
  13. $fields = call_user_func([$detector, "fields"]);
  14. $diffFields = call_user_func([$detector, "diffFields"]);
  15. if (!$fields) {
  16. return [];
  17. }
  18. $items = [];
  19. foreach ($fields as $field) {
  20. if (! $model->isDirty($field)) {
  21. continue;
  22. }
  23. $items[] = [
  24. 'old' => is_array($model->getOriginal($field)) ? json_encode($model->getOriginal($field)) : $model->getOriginal($field),
  25. 'field' => $field,
  26. 'new' => is_array($model->$field) ? json_encode($model->$field) : $model->$field,
  27. 'diff' => in_array($field, $diffFields) ? text_diff($model->getOriginal($field) ?? '', $model->$field ?? '') : null,
  28. ];
  29. }
  30. return $items;
  31. }
  32. }