Completed
Push — dev ( 917cb5...992eab )
by Marc
10:46
created

ModelObtainer::getModels()   B

Complexity

Conditions 5
Paths 7

Size

Total Lines 30
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 8
Bugs 1 Features 1
Metric Value
c 8
b 1
f 1
dl 0
loc 30
rs 8.439
cc 5
eloc 16
nc 7
nop 0
1
<?php namespace Mascame\Artificer\Model;
2
3
use File;
4
use Mascame\Artificer\Options\AdminOption;
5
use Mascame\Artificer\Permit\ModelPermit;
6
7
class ModelObtainer
8
{
9
10
    /**
11
     * @var array
12
     */
13
    public $models;
14
15
    /**
16
     *
17
     */
18
    public function __construct()
19
    {
20
        $this->models = $this->getModels();
21
    }
22
23
    /**
24
     * @param $directory
25
     * @return array
26
     */
27
    protected function scanModelsDirectory($directory, $namespace = null)
28
    {
29
        $models = [];
30
31
        foreach (File::allFiles($directory) as $modelPath) {
32
            $modelName = $this->getFromFileName($modelPath);
33
34
            if (! ModelPermit::access($modelName)) {
35
                continue;
36
            }
37
38
            $models[$modelName] = $this->getModelBasics($modelName, $namespace);
39
        }
40
41
        return $models;
42
    }
43
44
    protected function getModelBasics($modelName, $namespace = null) {
45
        return [
46
            'name' => $modelName,
47
            'namespace' => $namespace,
48
            'route' => $this->makeModelRoute($modelName),
49
            'fake' => false
50
        ];
51
    }
52
53
    /**
54
     * @param $modelName
55
     * @return string
56
     */
57
    protected function makeModelRoute($modelName)
58
    {
59
        return strtolower($modelName);
60
    }
61
62
    /**
63
     * @param $models
64
     * @return array
65
     */
66
    private function mergeModelDirectories($models)
67
    {
68
        $mergedModels = [];
69
70
        foreach ($models as $key => $model) {
71
            foreach ($model as $name => $values) {
72
                $mergedModels[$name] = $values;
73
            }
74
        }
75
76
        return $mergedModels;
77
    }
78
79
    /**
80
     * @return array
81
     */
82
    public function getModels()
83
    {
84
        if ( ! empty($this->models)) return $this->models;
85
86
        $models = [];
87
        $configModels = config('admin.model.models', []);
88
89
        foreach ($configModels as $model) {
90
            $pieces = explode('\\', $model);
91
            $modelName = end($pieces);
92
93
            $basicInfo = $this->getModelBasics($modelName, preg_replace('/\\\\' . $modelName . '$/', '', $model));
94
95
            $models[] = [$modelName => $basicInfo];
96
        }
97
98
        $modelDirectories = config('admin.model.directories', []);
99
100
        foreach ($modelDirectories as $namespace => $directory) {
101
            if (! file_exists($directory)) {
102
                throw new \Exception("Artificer can't find your models directory: '{$directory}'. Ensure that path exists and is properly set in your models config");
103
            }
104
105
            $models[] = $this->scanModelsDirectory($directory, $namespace);
106
        }
107
108
        $models = array_merge($this->mergeModelDirectories($models), $this->getFakeModels());
109
110
        return $models;
111
    }
112
113
    public function getFakeModels()
114
    {
115
        $fakeModels = AdminOption::get('model.fake');
116
        $models = [];
117
118
        if (empty($fakeModels)) {
119
            return $models;
120
        }
121
122
        foreach ($fakeModels as $modelName => $modelData) {
123
            $models[$modelName] = array(
124
                'name' => $modelName,
125
                'route' => $this->makeModelRoute($modelName),
126
                'fake' => array_merge($modelData, array(
127
                    'model' => $modelName
128
                ))
129
            );
130
        }
131
132
        return $models;
133
    }
134
135
    /**
136
     * @param $model
137
     * @return mixed
138
     */
139
    public function getFromFileName($model)
140
    {
141
        $piece = explode('/', $model);
142
143
        return str_replace('.php', '', end($piece));
144
    }
145
146
}