Completed
Push — dev ( 6af46b...fd204c )
by Marc
02:13
created

Model   A

Complexity

Total Complexity 33

Size/Duplication

Total Lines 261
Duplicated Lines 0 %

Coupling/Cohesion

Components 3
Dependencies 6

Importance

Changes 19
Bugs 3 Features 1
Metric Value
wmc 33
c 19
b 3
f 1
lcom 3
cbo 6
dl 0
loc 261
rs 9.3999

17 Methods

Rating   Name   Duplication   Size   Complexity  
A isHidden() 0 4 2
A hasGuarded() 0 4 1
A hasFillable() 0 4 1
A getCurrentModelName() 0 14 4
A prepareCurrentModel() 0 9 1
A getCurrentModelData() 0 12 1
A isCurrent() 0 6 2
A getCurrent() 0 4 2
A getRouteName() 0 6 3
A setCurrent() 0 5 1
A getOptions() 0 8 3
A getDefaultOptions() 0 6 2
A getOption() 0 7 3
A getRelations() 0 4 1
A __construct() 0 11 2
A share() 0 6 1
A getModelsData() 0 20 3
1
<?php namespace Mascame\Artificer\Model;
2
3
use Illuminate\Contracts\Database\ModelIdentifier;
4
use View;
5
use Route;
6
use \Illuminate\Support\Str as Str;
7
use Mascame\Artificer\Options\AdminOption;
8
9
// Todo: get column type http://stackoverflow.com/questions/18562684/how-to-get-database-field-type-in-laravel
10
class Model
11
{
12
13
    /**
14
     * @var ModelSchema
15
     */
16
    public $schema;
17
18
    /**
19
     * @var array
20
     */
21
    public $models;
22
23
    /**
24
     * @var array
25
     */
26
    public $columns;
27
28
    /**
29
     * @var \Illuminate\Database\Eloquent\Model
30
     */
31
    public $model;
32
33
    /**
34
     * @var string
35
     */
36
    public $class;
37
38
    /**
39
     * @var
40
     */
41
    public $name;
42
43
    /**
44
     * @var string
45
     */
46
    public $keyname;
47
48
    /**
49
     * @var
50
     */
51
    public $table;
52
53
    /**
54
     * @var
55
     */
56
    public $fillable;
57
58
    /**
59
     * @var array|mixed
60
     */
61
    protected $options = [];
62
    protected $defaultOptions = null;
63
64
    /**
65
     * @var array|mixed
66
     */
67
    public $relations = [];
68
69
    /**
70
     * @var
71
     */
72
    public static $current = null;
73
74
    /**
75
     * @param ModelSchema $schema
76
     */
77
    public function __construct(ModelSchema $schema)
78
    {
79
        $this->schema = $schema;
80
        $this->relations = new ModelRelation();
81
82
        if (Str::startsWith(Route::currentRouteName(), 'admin.model.')) {
83
            $this->prepareCurrentModel();
84
        }
85
86
        $this->share();
87
    }
88
89
90
    public function share()
91
    {
92
        View::share('tables', $this->schema->tables);
93
        View::share('models', $this->models = $this->getModelsData());
94
        View::share('model', $this->getCurrentModelData());
95
    }
96
97
    /**
98
     * @return array
99
     */
100
    private function getModelsData()
101
    {
102
        foreach ($this->schema->models as $modelName => $model) {
103
            $this->schema->models[$modelName]['options'] = $this->getOptions($modelName);
104
            $this->schema->models[$modelName]['hidden'] = $this->isHidden($modelName);
105
106
            $title = null;
0 ignored issues
show
Unused Code introduced by
$title is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
107
            if (isset($this->schema->models[$modelName]['title'])) {
108
                $title = $this->schema->models[$modelName]['title'];
109
            } else {
110
                $title = Str::title(
111
                  str_replace('_', ' ', $this->schema->models[$modelName]['table'])
112
                );
113
            }
114
115
            $this->schema->models[$modelName]['title'] = $title;
116
        }
117
118
        return $this->schema->models;
119
    }
120
121
    /**
122
     * @param $modelName
123
     * @return bool
124
     */
125
    public function isHidden($modelName)
126
    {
127
        return (in_array($modelName, AdminOption::get('model.hidden'))) ? true : false;
128
    }
129
130
    /**
131
     * @return bool
132
     */
133
    public function hasGuarded()
134
    {
135
        return ! empty($this->getOption('guarded', []));
136
    }
137
138
    /**
139
     * @return bool
140
     */
141
    public function hasFillable()
142
    {
143
        return ! empty($this->getOption('fillable', []));
144
    }
145
146
    /**
147
     * @return int|null|string
148
     */
149
    private function getCurrentModelName()
150
    {
151
        if ($this->name) return $this->name;
152
153
        foreach ($this->schema->models as $modelName => $model) {
154
            if ($this->isCurrent($modelName)) {
155
                $this->setCurrent($modelName);
156
157
                return $this->name = $modelName;
158
            }
159
        }
160
161
        return null;
162
    }
163
164
    protected function prepareCurrentModel()
165
    {
166
        $this->name = $this->getCurrentModelName();
167
        $this->class = $this->schema->getClass($this->name);
168
        $this->model = $this->schema->getInstance($this->name);
0 ignored issues
show
Bug introduced by
It seems like $this->name can also be of type integer or string; however, Mascame\Artificer\Model\ModelSchema::getInstance() does only seem to accept null, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
169
        $this->table = $this->model->getTable();
170
        $this->columns = $this->schema->getColumns($this->table);
171
        $this->fillable = $this->model->getFillable();
172
    }
173
174
    /**
175
     * @return array
176
     */
177
    private function getCurrentModelData()
178
    {
179
        return array(
180
            'class' => $this->class,
181
            'name' => $this->getCurrentModelName(),
182
            'route' => $this->getRouteName(),
183
            'table' => $this->table,
184
            'columns' => $this->schema->columns,
185
            'fillable' => $this->fillable,
186
            'hidden' => $this->isHidden($this->name),
187
        );
188
    }
189
190
    /**
191
     * @param $model
192
     * @return bool
193
     */
194
    protected function isCurrent($modelName)
195
    {
196
        $slug = Route::current()->parameter('slug');
197
198
        return (isset($this->schema->models[$modelName]['route']) && $this->schema->models[$modelName]['route'] == $slug);
199
    }
200
201
    /**
202
     * @return Model
203
     */
204
    public static function getCurrent()
205
    {
206
        return (isset(self::$current)) ? self::$current : null;
207
    }
208
209
    /**
210
     * @param null $model
211
     * @return null
212
     */
213
    public function getRouteName($model = null)
214
    {
215
        if ($model) return $this->schema->models[$model]['route'];
216
217
        return (isset($this->schema->models[self::$current]['route'])) ? $this->schema->models[self::$current]['route'] : null;
218
    }
219
220
    /**
221
     * @param $modelName
222
     */
223
    protected function setCurrent($modelName)
224
    {
225
        self::$current = $modelName;
226
//        ModelOption::set('current', $modelName);
227
    }
228
229
    /**
230
     * @param null $model
231
     * @return mixed
232
     */
233
    public function getOptions($model = null)
234
    {
235
        $model = ($model) ? $model : $this->name;
236
237
        if (isset($this->options[$model])) return $this->options[$model];
238
239
        return $this->options[$model] = config('admin.models.' . $model);
240
    }
241
242
    public function getDefaultOptions()
243
    {
244
        if ($this->defaultOptions) return $this->defaultOptions;
245
246
        return $this->defaultOptions = config('admin.model.default_model');
247
    }
248
249
    /**
250
     * @param $key
251
     * @param null $model
252
     * @return mixed
253
     */
254
    public function getOption($key, $default = null, $model = null)
255
    {
256
        $model = ($model) ? $model : $this->name;
257
        $options = $this->getOptions($model);
0 ignored issues
show
Bug introduced by
It seems like $model defined by $model ? $model : $this->name on line 256 can also be of type integer or string; however, Mascame\Artificer\Model\Model::getOptions() does only seem to accept null, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
258
259
        return (isset($options[$key])) ? $options[$key] : $default;
260
    }
261
262
    /**
263
     * @return array|mixed
264
     */
265
    public function getRelations()
266
    {
267
        return $this->relations->get();
268
    }
269
270
}