Completed
Push — master ( 685897...eb8d9a )
by Igor
02:22
created

Request   A

Complexity

Total Complexity 33

Size/Duplication

Total Lines 203
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 33
lcom 1
cbo 0
dl 0
loc 203
rs 9.3999
c 2
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A url() 0 4 1
C __construct() 0 65 13
A method() 0 4 1
A languageDefault() 0 4 1
A languageCode() 0 4 1
A package() 0 4 1
A route() 0 4 1
C makeUrl() 0 51 14
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|string $url
22
     */
23
    public function __construct(array $languageList = [], array $packageList = [], $url = null)
24
    {
25
        if (null === $url) {
26
            $url = $_SERVER['REQUEST_URI'] ?? '';
27
        }
28
        $this->method = 'GET';
29
        $this->languageDefault = $languageList[0] ?? '';
30
        $this->languageCode = '';
31
        $this->package = 'Original';
32
        $this->route = 'index';
33
34
        $url = explode('?', $url);
35
        $url = $url[0];
36
        $url = trim(trim($url), '/');
37
        if ('' !== $url) {
38
            $partList = explode('/', $url);
39
40
            /**
41
             * Delete front controller.
42
             */
43
            if (false !== strpos($partList[0], '.php')) {
44
                unset($partList[0]);
45
            }
46
47
            /**
48
             * Check language.
49
             */
50
            if (isset($partList[0]) && false !== ($key = array_search($partList[0], $languageList))) {
51
                unset($partList[0]);
52
                $this->languageCode = $languageList[$key];
53
            }
54
55
            /**
56
             * Check package.
57
             */
58
            if (isset($partList[0]) && false !== ($key = array_search(ucfirst($partList[0]), $packageList))) {
59
                unset($partList[0]);
60
                $this->package = $packageList[$key];
61
            }
62
63
            /**
64
             * Get route.
65
             */
66
            if (isset($partList[0])) {
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
     * Request method.
101
     *
102
     * @return string
103
     */
104
    public function method()
105
    {
106
        return $this->method;
107
    }
108
109
    /**
110
     * A default language code.
111
     *
112
     * @return string
113
     */
114
    public function languageDefault()
115
    {
116
        return $this->languageDefault;
117
    }
118
119
    /**
120
     * A language code.
121
     *
122
     * @return string
123
     */
124
    public function languageCode()
125
    {
126
        return $this->languageCode;
127
    }
128
129
    /**
130
     * Name of an app package.
131
     *
132
     * @return string
133
     */
134
    public function package()
135
    {
136
        return $this->package;
137
    }
138
139
    /**
140
     * URL path without front controller, language code, package name and an optional query.
141
     *
142
     * @return string
143
     */
144
    public function route()
145
    {
146
        return $this->route;
147
    }
148
149
150
    /**
151
     * Create absolute url path or full uri from route.
152
     *
153
     * @param string $route
154
     * @param bool $domain
155
     *
156
     * @return string
157
     */
158
    public function makeUrl($route = '', $domain = false)
159
    {
160
        $controller = '';
161
        if (false !== strpos($this->url, '.php')) {
162
            $controller = explode('.php', $this->url);
163
            $controller = ltrim($controller[0], '/') . '.php';
164
        }
165
        $route = trim($route, '/');
166
        if ('Original' == $this->package) {
167
            if ($this->languageCode != $this->languageDefault) {
168
                $url = trim('/' . $this->languageCode . '/' . $route, '/');
169
            } else {
170
                $url = trim('/' . $route, '/');
171
            }
172
        } else {
173
            if ($this->languageCode != $this->languageDefault) {
174
                $url = trim('/' . $this->languageCode . '/' . lcfirst($this->package) . '/' . $route, '/');
175
            } else {
176
                $url = trim('/' . lcfirst($this->package) . '/' . $route, '/');
177
            }
178
        }
179
        if ($domain) {
180
            $host = '';
181
            if (isset($_SERVER['HTTP_HOST'])) {
182
                $host = $_SERVER['HTTP_HOST'];
183
            } else if (isset($_SERVER['SERVER_NAME'])) {
184
                $host = $_SERVER['SERVER_NAME'];
185
            }
186
            if (
187
                (isset($_SERVER['HTTPS']) && 'off' !== $_SERVER['HTTPS']) ||
188
                (isset($_SERVER['SERVER_PORT']) && 443 == $_SERVER['SERVER_PORT'])
189
            ) {
190
                $url = 'https://';
191
            } else {
192
                $url = 'http://';
193
            }
194
            if (empty($controller)) {
195
                $url .= $host . '/' . $url;
196
            } else {
197
                $url .= $host . '/' . $controller . '/' . $url;
198
            }
199
        } else {
200
            if (empty($controller)) {
201
                $url = '/' . $url;
202
            } else {
203
                $url = '/' . $controller . '/' . $url;
204
            }
205
        }
206
207
        return $url;
208
    }
209
210
    private $url;
211
    private $method;
212
    private $languageDefault;
213
    private $languageCode;
214
    private $package;
215
    private $route;
216
}