/
Router.php
98 lines (81 loc) · 1.98 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
<?php
namespace Flyer\Components\Router;
use Closure;
use Flyer\Foundation\Registry;
use Symfony\Component\HttpFoundation\Request;
use Flyer\Components\Http;
use Flyer\Components\Router\Route;
use Flyer\Foundation\Events\Events;
class Router
{
protected static $routes = array();
protected $methods = array("POST", "GET"); // DELETE/UPDATE?
private $request;
public static function addRoute($method, $listener, $route)
{
self::$routes[$listener] = array(
'method' => $method,
'route' => $route
);
}
public function setRequest(Request $request)
{
$this->request = $request;
}
public function route()
{
if (in_array($this->request->server->get('REQUEST_METHOD'), $this->methods))
{
foreach (self::$routes as $listener => $route)
{
if ($this->request->server->get('REQUEST_METHOD') == $route['method'])
{
$uri = explode('/', ltrim($this->request->getPathInfo(), '/'));
if (strtolower($uri[0]) == $listener)
{
$this->generateRouteEvent($route['route']);
return;
}
}
}
}
}
public function generateRouteEvent($route)
{
if (is_object($route) && $route instanceof Closure)
{
$this->handleClosure($route);
} else if (is_string($route)) {
$this->handleString($route);
} else {
throw new \Exception("Router: Cannot determain variable type of route");
}
}
protected function handleClosure($route)
{
Events::create(array(
'title' => 'application.route',
'event' => $route
));
}
protected function handleString($route)
{
Registry::set('application.controller.path', $this->resolveController($route));
Events::create(array(
'title' => 'application.route',
'event' => function () {
$action = Registry::get('application.controller.path');
$route = new $action['controller'];
$route->$action['method']();
}
));
}
protected function resolveController($route)
{
$pieces = explode('@', $route);
return array(
'controller' => $pieces[0],
'method' => $pieces[1]
);
}
}