aboutsummaryrefslogtreecommitdiffstats
path: root/core/namespace/Router.php
blob: ffb3154989fce3d663cd95dbd2b2132907637dc8 (plain)
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
<?php
class Router {
	private static $routes = [];

	#===============================================================================
	# Add route
	#===============================================================================
	public static function add($pattern, callable $callback) {
		$pattern = Application::get('PATHINFO.BASE').$pattern;

		return self::$routes[] = [
			'type' => 'route',
			'pattern' => $pattern,
			'callback' => $callback
		];
	}

	#===============================================================================
	# Add redirect
	#===============================================================================
	public static function addRedirect($pattern, $location, $code = 302) {
		$pattern = Application::get('PATHINFO.BASE').$pattern;

		return self::$routes[] = [
			'type' => 'redirect',
			'code' => $code,
			'pattern' => $pattern,
			'location' => $location
		];
	}

	#===============================================================================
	# Execute routing
	#===============================================================================
	public static function execute($path) {
		$path = ltrim($path, '/');
		$route_found = false;

		foreach(self::$routes as $route) {
			if($route['type'] === 'redirect') {
				$location = preg_replace("#^{$route['pattern']}$#", $route['location'], $path, -1, $count);

				if($count) {
					HTTP::redirect($location, $route['code']);
				}
			}

			else {
				if(preg_match("#^{$route['pattern']}$#", $path, $matches)) {
					# Remove the first element from matches which contains the whole string.
					array_shift($matches);

					$route_found = true;
					call_user_func_array($route['callback'], $matches);
				}
			}
		}

		if($route_found === false) {
			Application::error404();
		}
	}
}