Completed
Push — master ( d5fdb4...de58e0 )
by Igor
02:18
created

Request::languageName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 0
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
        $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])) {
51
                $key = array_search($partList[0], $languageList);
52
                if (false !== $key) {
53
                    unset($partList[0]);
54
                    $this->languageCode = $languageList[$key];
55
                }
56
            }
57
58
            /**
59
             * Check package.
60
             */
61
            if (isset($partList[0])) {
62
                $key = array_search(ucfirst($partList[0]), $packageList);
63
                if (false !== $key) {
64
                    unset($partList[0]);
65
                    $this->package = $packageList[$key];
66
                }
67
            }
68
69
            /**
70
             * Get route.
71
             */
72
            if (isset($partList[0])) {
73
                $this->route = implode('/', $partList);
74
                $this->route = trim(str_replace('.', '_', $this->route), '/');
75
            }
76
        }
77
78
        /**
79
         * Request URL.
80
         */
81
        $this->url = '/' . $url;
82
83
        /**
84
         * Get method.
85
         */
86
        if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && 'xmlhttprequest' == strtolower($_SERVER['HTTP_X_REQUESTED_WITH'])) {
87
            $this->method = 'AJAX';
88
        } else {
89
            if (isset($_SERVER['REQUEST_METHOD'])) {
90
                $this->method = $_SERVER['REQUEST_METHOD'];
91
            }
92
        }
93
    }
94
95
    /**
96
     * Path without an optional query.
97
     *
98
     * @return string
99
     */
100
    public function url()
101
    {
102
        return $this->url;
103
    }
104
105
    /**
106
     * Request method.
107
     *
108
     * @return string
109
     */
110
    public function method()
111
    {
112
        return $this->method;
113
    }
114
115
    /**
116
     * A default language code.
117
     *
118
     * @return string
119
     */
120
    public function languageDefault()
121
    {
122
        return $this->languageDefault;
123
    }
124
125
    /**
126
     * A language code.
127
     *
128
     * @return string
129
     */
130
    public function languageCode()
131
    {
132
        return $this->languageCode;
133
    }
134
135
    /**
136
     * Name of an app package.
137
     *
138
     * @return string
139
     */
140
    public function package()
141
    {
142
        return $this->package;
143
    }
144
145
    /**
146
     * URL path without front controller, language code, package name and an optional query.
147
     *
148
     * @return string
149
     */
150
    public function route()
151
    {
152
        return $this->route;
153
    }
154
155
156
    /**
157
     * Create absolute url path or full uri from route.
158
     *
159
     * @param string $route
160
     * @param bool $domain
161
     *
162
     * @return string
163
     */
164
    public function makeUrl($route = '', $domain = false)
165
    {
166
        $controller = '';
167
        if (false !== strpos($this->url, '.php')) {
168
            $controller = explode('.php', $this->url);
169
            $controller = ltrim($controller[0], '/') . '.php';
170
        }
171
        $route = trim($route, '/');
172
        if ('Original' == $this->package) {
173
            if ($this->languageCode != $this->languageDefault) {
174
                $url = trim('/' . $this->languageCode . '/' . $route, '/');
175
            } else {
176
                $url = trim('/' . $route, '/');
177
            }
178
        } else {
179
            if ($this->languageCode != $this->languageDefault) {
180
                $url = trim('/' . $this->languageCode . '/' . lcfirst($this->package) . '/' . $route, '/');
181
            } else {
182
                $url = trim('/' . lcfirst($this->package) . '/' . $route, '/');
183
            }
184
        }
185
        if ($domain) {
186
            $host = '';
187
            if (isset($_SERVER['HTTP_HOST'])) {
188
                $host = $_SERVER['HTTP_HOST'];
189
            } else if (isset($_SERVER['SERVER_NAME'])) {
190
                $host = $_SERVER['SERVER_NAME'];
191
            }
192
            if (
193
                (isset($_SERVER['HTTPS']) && 'off' !== $_SERVER['HTTPS']) ||
194
                (isset($_SERVER['SERVER_PORT']) && 443 == $_SERVER['SERVER_PORT'])
195
            ) {
196
                $url = 'https://';
197
            } else {
198
                $url = 'http://';
199
            }
200
            if (empty($controller)) {
201
                $url .= $host . '/' . $url;
202
            } else {
203
                $url .= $host . '/' . $controller . '/' . $url;
204
            }
205
        } else {
206
            if (empty($controller)) {
207
                $url = '/' . $url;
208
            } else {
209
                $url = '/' . $controller . '/' . $url;
210
            }
211
        }
212
213
        return $url;
214
    }
215
216
    private $url;
217
    private $method;
218
    private $languageDefault;
219
    private $languageCode;
220
    private $package;
221
    private $route;
222
}