Issues (1519)

system/Inji/App.php (2 issues)

1
<?php
2
3
namespace Inji;
4
/**
5
 * App
6
 *
7
 * @author Alexey Krupskiy <[email protected]>
8
 * @link http://inji.ru/
9
 * @copyright 2015 Alexey Krupskiy
10
 * @license https://github.com/injitools/cms-Inji/blob/master/LICENSE
11
 */
12
class App {
13
14
    /**
15
     * static instance
16
     *
17
     * @var App
18
     */
19
    public static $cur = null;
20
21
    /**
22
     * @var App
23
     */
24
    public static $primary = null;
25
    private $_objects = [];
26
27
    /**
28
     * App params
29
     */
30
    public $name = '';
31
    public $dir = '';
32
    public $namespace = 'SiteApp';
33
    public $type = 'app';
34
    public $system = false;
35
    public $default = false;
36
    public $route = '';
37
    public $installed = false;
38
    public $staticPath = '/static';
39
    public $templatesPath = '/static/templates';
40
    public $path = '';
41
    public $params = [];
42
    public $config = [];
43
44
    /**
45
     * Constructor App
46
     *
47
     * @param array $preSet
48
     */
49 1
    public function __construct($preSet = []) {
50 1
        foreach ($preSet as $key => $value) {
51 1
            $this->{$key} = $value;
52
        }
53 1
    }
54
55
    /**
56
     * Return module object by name or alias
57
     *
58
     * @param string $className
59
     * @return Module|false
60
     */
61 4
    public function getObject($className, $params = []) {
62 4
        $paramsStr = serialize($params);
63 4
        $className = ucfirst($className);
64 4
        if (isset($this->_objects[$className][$paramsStr])) {
65 4
            return $this->_objects[$className][$paramsStr];
66
        }
67 1
        $installed = Module::getInstalled($this);
68 1
        if (!in_array(ucfirst($className), $installed)) {
69
            return false;
70
        }
71 1
        return $this->loadObject($className, $params);
72
    }
73
74
    /**
75
     * Find module class from each paths
76
     *
77
     * @param string $moduleName
78
     * @return mixed
79
     */
80 1
    public function findModuleClass($moduleName) {
81 1
        $possibleModules = $this->possibleModuleClasses($moduleName);
82 1
        foreach ($possibleModules as $possibleModule) {
83 1
            if (class_exists($possibleModule)) {
84 1
                return $possibleModule;
85
            }
86
        }
87
        if (!empty($this->config['moduleRouter'])) {
88
            foreach ($this->config['moduleRouter'] as $route => $module) {
89
                if (preg_match("!{$route}!i", $moduleName)) {
90
                    $possibleModules = $this->possibleModuleClasses($module);
91
                    foreach ($possibleModules as $possibleModule) {
92
                        if (class_exists($possibleModule)) {
93
                            return $possibleModule;
94
                        }
95
                    }
96
                }
97
            }
98
        }
99
        if (!empty(\Inji::$config['moduleRouter'])) {
100
            foreach (\Inji::$config['moduleRouter'] as $route => $module) {
101
                if (preg_match("!{$route}!i", $moduleName)) {
102
                    $possibleModules = $this->possibleModuleClasses($module);
103
                    foreach ($possibleModules as $possibleModule) {
104
                        if (class_exists($possibleModule)) {
105
                            return $possibleModule;
106
                        }
107
                    }
108
                }
109
            }
110
        }
111
        return false;
112
    }
113
114 1
    public function possibleModuleClasses($moduleName) {
115 1
        $possibleModules = [];
116 1
        if ($this->namespace) {
117 1
            $possibleModules[] = $this->namespace . '\\' . $moduleName;
118
        }
119 1
        $possibleModules[] = "Inji\\{$moduleName}";
120 1
        return $possibleModules;
121
    }
122
123
    public function isLoaded($moduleName) {
124
        return !empty($this->_objects[$moduleName]);
125
    }
126
127
    public function getDomain($decode = false) {
128
        return !empty($this->config['site']['domain']) ? $this->config['site']['domain'] : ($decode ? idn_to_utf8(INJI_DOMAIN_NAME) : INJI_DOMAIN_NAME);
129
    }
130
131
    /**
132
     * Load module by name or alias
133
     *
134
     * @param string $className
135
     * @return mixed
136
     */
137 1
    public function loadObject($className, $params = []) {
138
139 1
        $paramsStr = serialize($params);
140 1
        $moduleClassName = $this->findModuleClass($className);
141 1
        if ($moduleClassName === false) {
142
            return false;
143
        }
144 1
        $this->_objects[$className][$paramsStr] = new $moduleClassName($this);
145 1
        if (isset($this->_objects[$className][$paramsStr])) {
146 1
            $this->_objects[$className][$paramsStr]->checkDbMigration();
147 1
            if (method_exists($this->_objects[$className][$paramsStr], 'init')) {
148 1
                call_user_func_array([$this->_objects[$className][$paramsStr], 'init'], $params);
149
            }
150 1
            return $this->_objects[$className][$paramsStr];
151
        }
152
        return false;
153
    }
154
155
    /**
156
     * Reference to module getter
157
     *
158
     * @param string $className
159
     * @return Module|null
160
     */
161 3
    public function __get($className) {
162 3
        return $this->getObject($className);
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->getObject($className) returns the type false which is incompatible with the documented return type null|Inji\Module.
Loading history...
163
    }
164
165
    /**
166
     * Reference to module getter with params
167
     *
168
     * @param string $className
169
     * @param array $params
170
     * @return Module|null
171
     */
172 4
    public function __call($className, $params) {
173 4
        return $this->getObject($className, $params);
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->getObject($className, $params) returns the type false which is incompatible with the documented return type null|Inji\Module.
Loading history...
174
    }
175
}