Completed
Push — master ( 7446b8...d37fab )
by Igor
02:28
created

Request   A

Complexity

Total Complexity 35

Size/Duplication

Total Lines 226
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 35
c 2
b 0
f 0
lcom 1
cbo 0
dl 0
loc 226
rs 9

10 Methods

Rating   Name   Duplication   Size   Complexity  
C __construct() 0 65 13
A url() 0 4 1
C makeUrl() 0 51 14
A method() 0 4 1
A languageDefault() 0 4 1
A languageCode() 0 4 1
A languageName() 0 4 1
A package() 0 4 1
A packageRoute() 0 4 1
A route() 0 4 1
1
<?php
2
/**
3
 * @license MIT
4
 * @author Igor Sorokin <[email protected]>
5
 */
6
namespace Dspbee\Core;
7
8
/**
9
 * Represents a HTTP request.
10
 *
11
 * Class Request
12
 * @package Dspbee\Core
13
 */
14
class Request
15
{
16
    /**
17
     * Request constructor.
18
     *
19
     * @param array $languageList
20
     * @param array $packageList
21
     * @param null $url
22
     */
23
    public function __construct(array $languageList = [], array $packageList = [], $url = null)
24
    {
25
        if (null === $url) {
26
            $url = $_SERVER['REQUEST_URI'] ?? '';
27
        }
28
29
        $this->method = 'GET';
30
31
        $this->languageDefault = key($languageList);
32
        $this->languageCode = '';
33
        $this->languageName = '';
34
        $this->package = 'Original';
35
        $this->packageRoute = $packageList['Original'] ?? false;
36
        $this->route = 'index';
37
38
        $url = explode('?', $url);
39
        $url = $url[0];
40
        $url = trim(trim($url), '/');
41
        if ('' !== $url) {
42
            $partList = explode('/', $url);
43
            /**
44
             * Delete front controller.
45
             */
46
            if (false !== strpos($partList[0], '.php')) {
47
                array_shift($partList);
48
            }
49
            /**
50
             * Check language.
51
             */
52
            if (isset($partList[0]) && isset($languageList[$partList[0]])) {
53
                $this->languageCode = array_shift($partList);
54
                $this->languageName = $languageList[$this->languageCode];
55
            }
56
            /**
57
             * Check package.
58
             */
59
            if (isset($partList[0]) && isset($packageList[ucfirst($partList[0])])) {
60
                $this->package = ucfirst(array_shift($partList));
61
                $this->packageRoute = $packageList[$this->package];
62
            }
63
            /**
64
             * Get route.
65
             */
66
            if (count($partList)) {
67
                $this->route = implode('/', $partList);
68
                $this->route = trim(str_replace('.', '_', $this->route), '/');
69
            }
70
        }
71
72
        /**
73
         * Request URL.
74
         */
75
        $this->url = '/' . $url;
76
77
        /**
78
         * Get method.
79
         */
80
        if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && 'xmlhttprequest' == strtolower($_SERVER['HTTP_X_REQUESTED_WITH'])) {
81
            $this->method = 'AJAX';
82
        } else {
83
            if (isset($_SERVER['REQUEST_METHOD'])) {
84
                $this->method = $_SERVER['REQUEST_METHOD'];
85
            }
86
        }
87
    }
88
89
    /**
90
     * Path without an optional query.
91
     *
92
     * @return string
93
     */
94
    public function url()
95
    {
96
        return $this->url;
97
    }
98
99
    /**
100
     * Create absolute url path or full uri from route.
101
     *
102
     * @param string $route
103
     * @param bool $domain
104
     *
105
     * @return string
106
     */
107
    public function makeUrl($route = '', $domain = false)
108
    {
109
        $controller = '';
110
        if (false !== strpos($this->url, '.php')) {
111
            $controller = explode('.php', $this->url);
112
            $controller = ltrim($controller[0], '/') . '.php';
113
        }
114
        $route = trim($route, '/');
115
        if ('Original' == $this->package) {
116
            if ($this->languageCode != $this->languageDefault) {
117
                $url = trim('/' . $this->languageCode . '/' . $route, '/');
118
            } else {
119
                $url = trim('/' . $route, '/');
120
            }
121
        } else {
122
            if ($this->languageCode != $this->languageDefault) {
123
                $url = trim('/' . $this->languageCode . '/' . lcfirst($this->package) . '/' . $route, '/');
124
            } else {
125
                $url = trim('/' . lcfirst($this->package) . '/' . $route, '/');
126
            }
127
        }
128
        if ($domain) {
129
            $host = '';
130
            if (isset($_SERVER['HTTP_HOST'])) {
131
                $host = $_SERVER['HTTP_HOST'];
132
            } else if (isset($_SERVER['SERVER_NAME'])) {
133
                $host = $_SERVER['SERVER_NAME'];
134
            }
135
            if (
136
                (isset($_SERVER['HTTPS']) && 'off' !== $_SERVER['HTTPS']) ||
137
                (isset($_SERVER['SERVER_PORT']) && 443 == $_SERVER['SERVER_PORT'])
138
            ) {
139
                $url = 'https://';
140
            } else {
141
                $url = 'http://';
142
            }
143
            if (empty($controller)) {
144
                $url .= $host . '/' . $url;
145
            } else {
146
                $url .= $host . '/' . $controller . '/' . $url;
147
            }
148
        } else {
149
            if (empty($controller)) {
150
                $url = '/' . $url;
151
            } else {
152
                $url = '/' . $controller . '/' . $url;
153
            }
154
        }
155
156
        return $url;
157
    }
158
159
160
    /**
161
     * Request method.
162
     *
163
     * @return string
164
     */
165
    public function method()
166
    {
167
        return $this->method;
168
    }
169
170
    /**
171
     * A default language code.
172
     *
173
     * @return string
174
     */
175
    public function languageDefault()
176
    {
177
        return $this->languageDefault;
178
    }
179
180
    /**
181
     * A language code.
182
     *
183
     * @return string
184
     */
185
    public function languageCode()
186
    {
187
        return $this->languageCode;
188
    }
189
190
    /**
191
     * A language name associated with code.
192
     *
193
     * @return string
194
     */
195
    public function languageName()
196
    {
197
        return $this->languageName;
198
    }
199
200
    /**
201
     * Name of an app package.
202
     *
203
     * @return string
204
     */
205
    public function package()
206
    {
207
        return $this->package;
208
    }
209
210
    /**
211
     * Custom routing class or false.
212
     *
213
     * @return string|bool
214
     */
215
    public function packageRoute()
216
    {
217
        return $this->packageRoute;
218
    }
219
220
    /**
221
     * URL path without front controller, language code, package name and an optional query.
222
     *
223
     * @return string
224
     */
225
    public function route()
226
    {
227
        return $this->route;
228
    }
229
230
    private $method;
231
232
    private $url;
233
    private $languageDefault;
234
    private $languageCode;
235
    private $languageName;
236
    private $package;
237
    private $packageRoute;
238
    private $route;
239
}