-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrouter.php
More file actions
58 lines (58 loc) · 1.89 KB
/
Copy pathrouter.php
File metadata and controls
58 lines (58 loc) · 1.89 KB
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
<?php
class Router
{
private static $nomatch = true;
private static function getUrl()
{
return $_SERVER["REQUEST_URI"];
}
private static function getParams($pattern)
{
$url = self::getUrl();
$pattern = str_replace('//', '/', $pattern);
if (preg_match_all('~\{([^{}]+)\}~', $pattern, $matches)) {
foreach ($matches[0] as $value) {
$pattern = str_replace($value, "(\w+)", $pattern);
}
}
$scriptName = str_replace('/index.php', '', $_SERVER["SCRIPT_NAME"]);
$prefix = @$pattern[0] != '/' ? "$scriptName/" : $scriptName;
$pattern = "~^{$prefix}{$pattern}(?:\?.*)?$~";
if (preg_match($pattern, $url, $matches)) {
return $matches;
}
return false;
}
static function get($pattern, $callback)
{
if ($_SERVER['REQUEST_METHOD'] != 'GET') {
throw new Exception($_SERVER['REQUEST_METHOD'] . " method not allowed for this routes", 501);
}
self::process($pattern, $callback);
}
static function post($pattern, $callback)
{
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
throw new Exception($_SERVER['REQUEST_METHOD'] . " method not allowed for this routes", 501);
}
self::process($pattern, $callback);
}
private static function process($pattern, $callback)
{
$params = self::getParams($pattern);
if ($params) {
self::$nomatch = false;
$functionArguments = array_slice($params, 1);
if (is_callable($callback)) {
if ($_SERVER['REQUEST_METHOD'] == 'POST') array_unshift($functionArguments, (object)$_POST);
$callback(...$functionArguments);
}
}
}
static function notFound()
{
if (self::$nomatch) {
header("HTTP/1.0 404 Not Found");
}
}
}