ModelHasUpdated   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 104
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Importance

Changes 0
Metric Value
wmc 8
lcom 1
cbo 4
dl 0
loc 104
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A createDirtyModel() 0 10 1
A getQuery() 0 12 2
A model() 0 4 1
A retrieveModel() 0 12 3
1
<?php
2
3
namespace RichanFongdasen\Varnishable\Events;
4
5
use Illuminate\Database\Eloquent\Builder;
6
use Illuminate\Database\Eloquent\Model;
7
use Illuminate\Database\Eloquent\SoftDeletes;
8
use Illuminate\Queue\SerializesModels;
9
10
class ModelHasUpdated
11
{
12
    use SerializesModels;
13
14
    /**
15
     * Eloquent model's data
16
     * after getting serialized into array.
17
     *
18
     * @var array
19
     */
20
    protected $data;
21
22
    /**
23
     * Eloquent model object.
24
     *
25
     * @var mixed
26
     */
27
    protected $model;
28
29
    /**
30
     * Eloquent model class name.
31
     *
32
     * @var string
33
     */
34
    protected $modelClass;
35
36
    /**
37
     * Event constructor.
38
     *
39
     * @param \Illuminate\Database\Eloquent\Model $model
40
     */
41
    public function __construct(Model $model)
42
    {
43
        $this->data = $model->toArray();
44
        $this->modelClass = get_class($model);
45
    }
46
47
    /**
48
     * Create dirty eloquent model object
49
     * based on the last saved model data.
50
     *
51
     * @return \Illuminate\Database\Eloquent\Model
52
     */
53
    protected function createDirtyModel(): Model
54
    {
55
        $this->model = app($this->modelClass);
56
        $this->model->fill($this->data);
57
58
        $key = $this->model->getKeyName();
59
        $this->model->setAttribute($key, data_get($this->data, $key));
60
61
        return $this->model;
62
    }
63
64
    /**
65
     * Get eloquent query builder for
66
     * the given eloquent model.
67
     *
68
     * @param \Illuminate\Database\Eloquent\Model $model
69
     *
70
     * @return \Illuminate\Database\Eloquent\Builder
71
     */
72
    protected function getQuery(Model $model): Builder
73
    {
74
        $query = $model->newQuery();
75
76
        $traits = collect(class_uses($model))->toArray();
77
78
        if (in_array(SoftDeletes::class, $traits, true)) {
79
            $query->withTrashed();
80
        }
81
82
        return $query;
83
    }
84
85
    /**
86
     * Model accessor.
87
     *
88
     * @return \Illuminate\Database\Eloquent\Model
89
     */
90
    public function model(): Model
91
    {
92
        return $this->retrieveModel() ?? $this->createDirtyModel();
93
    }
94
95
    /**
96
     * Retrieve fresh eloquent model from
97
     * run-time cache or the database.
98
     *
99
     * @return \Illuminate\Database\Eloquent\Model|null
100
     */
101
    protected function retrieveModel(): ?Model
102
    {
103
        if ($this->model !== null) {
104
            return $this->model;
105
        }
106
107
        $model = app($this->modelClass);
108
109
        $this->model = $this->getQuery($model)->find(data_get($this->data, $model->getKeyName()));
110
111
        return ($this->model instanceof Model) ? $this->model : null;
112
    }
113
}
114