Passed
Push — master ( 517cb3...2c2725 )
by Atanas
02:15
created

Router   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 117
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 1
Metric Value
dl 0
loc 117
rs 10
c 1
b 0
f 1
ccs 31
cts 31
cp 1
wmc 13
lcom 1
cbo 4

7 Methods

Rating   Name   Duplication   Size   Complexity  
A boot() 0 4 1
A registerRewriteRules() 0 6 2
A execute() 0 18 4
A handle() 0 16 3
A getCurrentRoute() 0 3 1
A setCurrentRoute() 0 3 1
A handleAll() 0 6 1
1
<?php
2
3
namespace WPEmerge\Routing;
4
5
use Exception;
6
use Psr\Http\Message\ResponseInterface;
7
use WPEmerge;
8
use WPEmerge\Request;
9
use WPEmerge\Response;
10
11
/**
12
 * Provide routing for site requests (i.e. all non-api requests)
13
 */
14
class Router implements HasRoutesInterface {
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
	 * @codeCoverageIgnore
28
	 * @return void
29
	 */
30
	public function boot() {
31
		add_action( 'init', array( $this, 'registerRewriteRules' ), 1000 );
32
		add_action( 'template_include', array( $this, 'execute' ), 1000 );
33
	}
34
35
	/**
36
	 * Register route rewrite rules with WordPress
37
	 *
38
	 * @codeCoverageIgnore
39
	 * @return void
40
	 */
41
	public function registerRewriteRules() {
42
		$rules = apply_filters( 'wp_emerge.routing.rewrite_rules', [] );
43
		foreach ( $rules as $rule => $rewrite_to ) {
44
			add_rewrite_rule( $rule, $rewrite_to, 'top' );
45
		}
46
	}
47
48
	/**
49
	 * Add global middlewares and execute the first satisfied route (if any)
50
	 *
51
	 * @param  string $template
52
	 * @return string
53
	 */
54 7
	public function execute( $template ) {
55 7
		$routes = $this->getRoutes();
56 7
		$global_middleware = WPEmerge::resolve( WP_EMERGE_ROUTING_GLOBAL_MIDDLEWARE_KEY );
57 7
		$request = Request::fromGlobals();
58
59 7
		foreach ( $routes as $route ) {
60 7
			$route->addMiddleware( $global_middleware );
61 7
		}
62
63 7
		foreach ( $routes as $route ) {
64 7
			if ( $route->isSatisfied( $request ) ) {
65 5
				$this->setCurrentRoute( $route );
66 5
				return $this->handle( $request, $route, $template );
67
			}
68 2
		}
69
70 2
		return $template;
71
	}
72
73
	/**
74
	 * Execute a route
75
	 *
76
	 * @throws Exception
77
	 * @param  Request        $request
78
	 * @param  RouteInterface $route
79
	 * @param  string         $template
80
	 * @return string
81
	 */
82 4
	protected function handle( Request $request, RouteInterface $route, $template ) {
83 4
		$response = $route->handle( $request, $template );
84
85 4
		if ( ! is_a( $response, ResponseInterface::class ) ) {
86 2
			if ( WPEmerge::debugging() ) {
87 1
				throw new Exception( 'Response returned by controller is not valid (expectected ' . ResponseInterface::class . '; received ' . gettype( $response ) . ').' );
88
			}
89 1
			$response = Response::error( Response::response(), 500 );
90 1
		}
91
92 3
		add_filter( 'wp_emerge.response', function() use ( $response ) {
93 2
			return $response;
94 3
		} );
95
96 3
		return WP_EMERGE_DIR . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR . 'template.php';
97
	}
98
99
	/**
100
	 * Get the current route
101
	 *
102
	 * @return RouteInterface
103
	 */
104 1
	public function getCurrentRoute() {
105 1
		return $this->current_route;
106
	}
107
108
	/**
109
	 * Set the current route
110
	 *
111
	 * @param  RouteInterface
112
	 * @return void
113
	 */
114 1
	public function setCurrentRoute( RouteInterface $current_route ) {
115 1
		$this->current_route = $current_route;
116 1
	}
117
118
	/**
119
	 * Handle ALL requests
120
	 *
121
	 * @param  string|Closure|null $handler
122
	 * @return RouteInterface
123
	 */
124 1
	public function handleAll( $handler = null ) {
125
		// match ANY request method
126
		// match ANY url
127
		// by default, use built-in WordPress controller
128 1
		return $this->any( '*', $handler );
129
	}
130
}
131