-
Notifications
You must be signed in to change notification settings - Fork 0
/
router.php
105 lines (91 loc) · 3.45 KB
/
router.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?php
class Router {
public static function redirect($new_route) {
return function() use ($new_route) {
redirect($new_route);
};
}
public static function render($target, $params = []) {
if (is_callable($target)) {
call_user_func($target, $params);
} else {
if (!str_ends_with($target, '.php'))
$target .= '.php';
include_once($target);
}
exit();
}
// Render a route with either a target file or a content function
public static function route($route, $target) {
$route = substr($route, 1);
$route_parts = explode('/', $route);
$request_url = filter_var($_SERVER['REQUEST_URI'], FILTER_SANITIZE_URL);
$request_url = substr($request_url, 1);
$request_parts = explode('/', $request_url);
$params = [];
if (count($route_parts) !== count($request_parts))
return;
for ($i = 0; $i < count($route_parts); $i++) {
$route_part = $route_parts[$i];
$request_part = $request_parts[$i];
if (strlen($route_part) > 0 && $route_part[0] === '$') {
$route_var_name = substr($route_part, 1);
$$route_var_name = $request_part;
$params[$route_var_name] = $request_part;
} else if ($route_part != $request_part) {
return;
}
}
if (is_callable($target)) {
call_user_func_array($target, $params);
} else {
if (!str_ends_with($target, '.php'))
$target .= '.php';
include_once($target);
}
exit();
}
public static function get($route, $target) {
if ($_SERVER['REQUEST_METHOD'] === 'GET')
self::route($route, $target);
}
public static function all($route, $target) {
self::route($route, $target);
}
public static function post($route, $target) {
if ($_SERVER['REQUEST_METHOD'] === 'POST')
self::route($route, $target);
}
// Must be called to be able to access static content
public static function default() {
$request_url = filter_var($_SERVER['REQUEST_URI'], FILTER_SANITIZE_URL);
$request_url = substr($request_url, 1);
$request_parts = explode('/', $request_url);
// Static content provider
if ($request_parts[0] === 'static') {
if (file_exists($request_url) && is_file($request_url)) {
$mime_type = mime_content_type($request_url);
if (str_ends_with($request_url, '.php'))
return;
if (str_ends_with($request_url, '.css'))
$mime_type = 'text/css';
if (str_ends_with($request_url, '.js'))
$mime_type = 'text/javascript';
if (str_ends_with($request_url, '.html'))
$mime_type = 'text/html';
header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");
header("Cache-Control: public");
header("Content-Type: " . $mime_type);
header("Content-Transfer-Encoding: Binary");
header("Content-Length: " . filesize($request_url));
readfile($request_url);
exit();
}
return;
}
}
public static function notfound($target) {
http_response_code(404);
self::render($target);
}
}