Completed
Push — dev ( 96c89c...ec5505 )
by Marc
02:11
created

Model::__construct()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 5
Bugs 1 Features 0
Metric Value
c 5
b 1
f 0
dl 0
loc 11
rs 9.4285
cc 2
eloc 6
nc 2
nop 1
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, config('admin.model.hidden'));
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
        $this->addFieldOptions($this->columns);
174
    }
175
176
    /**
177
     * Fills all fields in config if they are not declared and applies default attributes
178
     *
179
     * @param $columns
180
     * @param null $model
181
     * @return mixed
182
     */
183
    protected function addFieldOptions($columns, $model = null) {
184
        $model = ($model) ? $model : $this->name;
185
186
        $this->getOptions($model);
0 ignored issues
show
Bug introduced by
It seems like $model defined by $model ? $model : $this->name on line 184 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...
187
188
        foreach ($columns as $column) {
189
            if (! isset($this->options[$model]['fields'][$column])) {
190
                $this->options[$model]['fields'][$column] = [];
191
            }
192
193
            if (! isset($this->options[$model]['fields'][$column]['attributes'])) {
194
                $this->options[$model]['fields'][$column]['attributes'] = $this->options[$model]['attributes'];
195
            }
196
        }
197
    }
198
199
    /**
200
     * @return array
201
     */
202
    private function getCurrentModelData()
203
    {
204
        return array(
205
            'class' => $this->class,
206
            'name' => $this->getCurrentModelName(),
207
            'route' => $this->getRouteName(),
208
            'table' => $this->table,
209
            'columns' => $this->schema->columns,
210
            'fillable' => $this->fillable,
211
            'hidden' => $this->isHidden($this->name),
212
        );
213
    }
214
215
    /**
216
     * @param $model
217
     * @return bool
218
     */
219
    protected function isCurrent($modelName)
220
    {
221
        if ( ! Route::current()) return null;
222
        
223
        $slug = Route::current()->parameter('slug');
224
225
        return (isset($this->schema->models[$modelName]['route']) && $this->schema->models[$modelName]['route'] == $slug);
226
    }
227
228
    /**
229
     * @return Model
230
     */
231
    public static function getCurrent()
232
    {
233
        return (isset(self::$current)) ? self::$current : null;
234
    }
235
236
    /**
237
     * @param null $model
238
     * @return null
239
     */
240
    public function getRouteName($model = null)
241
    {
242
        if ($model) return $this->schema->models[$model]['route'];
243
244
        return (isset($this->schema->models[self::$current]['route'])) ? $this->schema->models[self::$current]['route'] : null;
245
    }
246
247
    /**
248
     * @param $modelName
249
     */
250
    protected function setCurrent($modelName)
251
    {
252
        self::$current = $modelName;
253
//        ModelOption::set('current', $modelName);
254
    }
255
256
    /**
257
     * @param null $model
258
     * @return mixed
259
     */
260
    public function getOptions($model = null)
261
    {
262
        $model = ($model) ? $model : $this->name;
263
264
        if (isset($this->options[$model])) return $this->options[$model];
265
266
        return $this->options[$model] = array_merge(
267
            $this->getDefaultOptions(),
268
            config('admin.models.' . $model, [])
269
        );
270
    }
271
272
    public function getDefaultOptions()
273
    {
274
        if ($this->defaultOptions) return $this->defaultOptions;
275
276
        return $this->defaultOptions = config('admin.model.default');
277
    }
278
279
    /**
280
     * @param $key
281
     * @param null $model
282
     * @return mixed
283
     */
284
    public function getOption($key, $default = null, $model = null)
285
    {
286
        $model = ($model) ? $model : $this->name;
287
        $options = $this->getOptions($model);
0 ignored issues
show
Bug introduced by
It seems like $model defined by $model ? $model : $this->name on line 286 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...
288
289
        return (isset($options[$key])) ? $options[$key] : $default;
290
    }
291
292
    /**
293
     * @return array|mixed
294
     */
295
    public function getRelations()
296
    {
297
        return $this->relations->get();
298
    }
299
300
}