ModelObtainer::makeModelRoute()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 1 Features 1
Metric Value
c 2
b 1
f 1
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 1
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 = array();
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] = array(
39
                'name' => $modelName,
40
                'namespace' => $namespace,
41
                'route' => $this->makeModelRoute($modelName),
42
                'fake' => false
43
            );
44
        }
45
46
        return $models;
47
    }
48
49
    /**
50
     * @param $modelName
51
     * @return string
52
     */
53
    protected function makeModelRoute($modelName)
54
    {
55
        return strtolower($modelName);
56
    }
57
58
    /**
59
     * @param $models
60
     * @return array
61
     */
62
    private function mergeModelDirectories($models)
63
    {
64
        $mergedModels = array();
65
66
        foreach ($models as $key => $model) {
67
            foreach ($model as $name => $values) {
68
                $mergedModels[$name] = $values;
69
            }
70
        }
71
72
        return $mergedModels;
73
    }
74
75
    /**
76
     * @return array
77
     */
78
    public function getModels()
79
    {
80
        if (!empty($this->models)) {
81
            return $this->models;
82
        }
83
84
        $models = array();
85
        $modelDirectories = AdminOption::get('models.directories');
86
87
        foreach ($modelDirectories as $namespace => $directory) {
88
            if (! file_exists($directory)) {
89
                throw new \Exception("Artificer can't find your models directory: '{$directory}'. Ensure that path exists and is properly set in your models config");
90
            }
91
92
            $models[] = $this->scanModelsDirectory($directory, $namespace);
93
        }
94
95
        $models = array_merge($this->mergeModelDirectories($models), $this->getFakeModels());
96
97
        return $models;
98
    }
99
100
    public function getFakeModels()
101
    {
102
        $fakeModels = AdminOption::get('models.fake');
103
        $models = array();
104
105
        if (empty($fakeModels)) {
106
            return $models;
107
        }
108
109
        foreach ($fakeModels as $modelName => $modelData) {
110
            $models[$modelName] = array(
111
                'name' => $modelName,
112
                'route' => $this->makeModelRoute($modelName),
113
                'fake' => array_merge($modelData, array(
114
                    'model' => $modelName
115
                ))
116
            );
117
        }
118
119
        return $models;
120
    }
121
122
    /**
123
     * @param $model
124
     * @return mixed
125
     */
126
    public function getFromFileName($model)
127
    {
128
        $piece = explode('/', $model);
129
130
        return str_replace('.php', '', end($piece));
131
    }
132
133
}