-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathToro.php
124 lines (107 loc) · 4.23 KB
/
Toro.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?php
class Toro
{
public static function serve($routes)
{
ToroHook::fire('before_request', compact('routes'));
$request_method = strtolower($_SERVER['REQUEST_METHOD']);
$path_info = '/';
if (!empty($_SERVER['PATH_INFO'])) {
$path_info = $_SERVER['PATH_INFO'];
}
else if (!empty($_SERVER['ORIG_PATH_INFO']) && $_SERVER['ORIG_PATH_INFO'] !== '/index.php') {
$path_info = $_SERVER['ORIG_PATH_INFO'];
}
else {
if (!empty($_SERVER['REQUEST_URI'])) {
$path_info = (strpos($_SERVER['REQUEST_URI'], '?') > 0) ? strstr($_SERVER['REQUEST_URI'], '?', true) : $_SERVER['REQUEST_URI'];
}
}
$discovered_handler = null;
$regex_matches = array();
if (isset($routes[$path_info])) {
$discovered_handler = $routes[$path_info];
}
else if ($routes) {
$tokens = array(
':string' => '([a-zA-Z]+)',
':number' => '([0-9]+)',
':alpha' => '([a-zA-Z0-9-_]+)'
);
foreach ($routes as $pattern => $handler_name) {
$pattern = strtr($pattern, $tokens);
if (preg_match('#^/?' . $pattern . '/?$#', $path_info, $matches)) {
$discovered_handler = $handler_name;
$regex_matches = $matches;
break;
}
}
}
$result = null;
$handler_instance = null;
if ($discovered_handler) {
if (is_string($discovered_handler)) {
$handler_instance = new $discovered_handler();
}
elseif (is_callable($discovered_handler)) {
$handler_instance = $discovered_handler();
}
}
if ($handler_instance) {
unset($regex_matches[0]);
if (self::is_xhr_request() && method_exists($handler_instance, $request_method . '_xhr')) {
header('Content-type: application/json');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
$request_method .= '_xhr';
}
if (method_exists($handler_instance, $request_method)) {
ToroHook::fire('before_handler', compact('routes', 'discovered_handler', 'request_method', 'regex_matches'));
$result = call_user_func_array(array($handler_instance, $request_method), $regex_matches);
ToroHook::fire('after_handler', compact('routes', 'discovered_handler', 'request_method', 'regex_matches', 'result'));
}
else {
ToroHook::fire('404', compact('routes', 'discovered_handler', 'request_method', 'regex_matches'));
}
}
else {
ToroHook::fire('404', compact('routes', 'discovered_handler', 'request_method', 'regex_matches'));
}
ToroHook::fire('after_request', compact('routes', 'discovered_handler', 'request_method', 'regex_matches', 'result'));
}
private static function is_xhr_request()
{
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest';
}
}
class ToroHook
{
private static $instance;
private $hooks = array();
private function __construct() {}
private function __clone() {}
public static function add($hook_name, $fn)
{
$instance = self::get_instance();
$instance->hooks[$hook_name][] = $fn;
}
public static function fire($hook_name, $params = null)
{
$instance = self::get_instance();
if (isset($instance->hooks[$hook_name])) {
foreach ($instance->hooks[$hook_name] as $fn) {
call_user_func_array($fn, array(&$params));
}
}
}
public static function get_instance()
{
if (empty(self::$instance)) {
self::$instance = new ToroHook();
}
return self::$instance;
}
}