Passed
Push — master ( ab9b3e...c5c770 )
by Atanas
01:47
created

Router::getCurrentRoute()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 2
c 1
b 0
f 1
nc 1
nop 0
dl 0
loc 3
ccs 0
cts 2
cp 0
crap 2
rs 10
1
<?php
2
3
namespace Obsidian\Routing;
4
5
use Exception;
6
use Psr\Http\Message\ResponseInterface;
7
use Obsidian\Framework;
8
use Obsidian\Request;
9
use Obsidian\Response as FrameworkResponse;
10
11
/**
12
 * Provide routing
13
 */
14
class Router {
15
	use HasRoutesTrait;
16
17
	/**
18
	 * Current active route
19
	 *
20
	 * @var RouteInterface
21
	 */
22
	protected $current_route = null;
23
24
	/**
25
	 * Hook into WordPress actions
26
	 *
27
	 * @return null
28
	 */
29
	public function boot() {
30
		add_action( 'init', array( $this, 'registerRewriteRules' ), 1000 );
31
		add_action( 'template_include', array( $this, 'execute' ), 1000 );
32
	}
33
34
	/**
35
	 * Register route rewrite rules with WordPress
36
	 *
37
	 * @return null
38
	 */
39
	public function registerRewriteRules() {
40
		$rules = apply_filters( 'obsidian_routing_rewrite_rules', [] );
41
		foreach ( $rules as $rule => $rewrite_to ) {
42
			add_rewrite_rule( $rule, $rewrite_to, 'top' );
43
		}
44
	}
45
46
	/**
47
	 * Add global middlewares and execute the first satisfied route (if any)
48
	 *
49
	 * @param  string $template
50
	 * @return string
51
	 */
52
	public function execute( $template ) {
53
		$routes = $this->getRoutes();
54
		$global_middleware = Framework::resolve( 'framework.routing.global_middleware' );
55
		$request = Request::fromGlobals();
56
57
		foreach ( $routes as $route ) {
58
			$route->addMiddleware( $global_middleware );
59
		}
60
61
		foreach ( $routes as $route ) {
62
			if ( $route->satisfied( $request ) ) {
63
				$this->current_route = $route;
64
				return $this->handle( $request, $route, $template );
65
			}
66
		}
67
68
		return $template;
69
	}
70
71
	/**
72
	 * Execute a route
73
	 *
74
	 * @param  Request        $request
75
	 * @param  RouteInterface $route
76
	 * @param  string         $template
77
	 * @return string
78
	 */
79
	protected function handle( Request $request, RouteInterface $route, $template ) {
80
		$response = $route->handle( $request, $template );
81
82
		if ( ! is_a( $response, ResponseInterface::class ) ) {
83
			if ( Framework::debugging() ) {
84
				throw new Exception( 'Response returned by controller is not valid (expectected ' . ResponseInterface::class . '; received ' . gettype( $response ) . ').' );
85
			}
86
			$response = FrameworkResponse::error( FrameworkResponse::response(), 500 );
87
		}
88
89
		add_filter( 'obsidian_response', function() use ( $response ) {
90
			return $response;
91
		} );
92
93
		return OBSIDIAN_DIR . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR . 'template.php';
94
	}
95
96
	/**
97
	 * Get the current route
98
	 *
99
	 * @return RouteInterface
100
	 */
101
	public function getCurrentRoute() {
102
		return $this->current_route;
103
	}
104
}
105