Passed
Push — master ( a92f9c...7b3be9 )
by Atanas
01:38
created

RouteGroup   A

Complexity

Total Complexity 23

Size/Duplication

Total Lines 138
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
eloc 42
dl 0
loc 138
ccs 0
cts 45
cp 0
rs 10
c 0
b 0
f 0
wmc 23

9 Methods

Rating   Name   Duplication   Size   Complexity  
A handle() 0 3 2
A isSatisfied() 0 3 1
A mergeConditions() 0 8 3
A __construct() 0 10 3
A getSatisfiedRoute() 0 8 3
A group() 0 12 4
A addMiddleware() 0 8 2
A getArguments() 0 3 2
A route() 0 10 3
1
<?php
2
3
namespace WPEmerge\Routing;
4
5
use Closure;
6
use Exception;
7
use WPEmerge\Facades\RouteCondition;
8
use WPEmerge\Helpers\Arguments;
9
use WPEmerge\Middleware\HasMiddlewareTrait;
10
use WPEmerge\Requests\Request;
11
use WPEmerge\Routing\Conditions\ConditionInterface;
12
use WPEmerge\Routing\Conditions\UrlCondition;
13
use WPEmerge\Routing\Conditions\MultipleCondition;
14
15
class RouteGroup implements RouteInterface, HasRoutesInterface {
16
	use HasRoutesTrait {
17
		route as traitRoute;
18
		group as traitGroup;
19
	}
20
21
	use HasMiddlewareTrait {
22
		addMiddleware as traitAddMiddleware;
23
	}
24
25
	/**
26
	 * Route condition
27
	 *
28
	 * @var ConditionInterface
29
	 */
30
	protected $condition = null;
31
32
	/**
33
	 * Constructor
34
	 *
35
	 * @throws Exception
36
	 * @param string|Closure|ConditionInterface $condition
37
	 * @param Closure|null                      $routes
38
	 */
39
	public function __construct( $condition, $routes = null ) {
40
		list( $condition, $routes ) = Arguments::flip( $condition, $routes );
41
42
		if ( $condition !== null && ! $condition instanceof ConditionInterface ) {
43
			$condition = RouteCondition::make( $condition );
44
		}
45
46
		$this->condition = $condition;
47
48
		$routes( $this );
49
	}
50
51
	/**
52
	 * Get the first child route which is satisfied
53
	 *
54
	 * @param  Request $request
55
	 * @return RouteInterface|null
56
	 */
57
	protected function getSatisfiedRoute( Request $request ) {
58
		$routes = $this->getRoutes();
59
		foreach ( $routes as $route ) {
60
			if ( $route->isSatisfied( $request ) ) {
61
				return $route;
62
			}
63
		}
64
		return null;
65
	}
66
67
	/**
68
	 * Merge 2 conditions.
69
	 * If $parent is a UrlCondition and $child is a UrlCondition, concatenate them.
70
	 * In all other cases, combine conditions into a MultipleCondition.
71
	 *
72
	 * @param  ConditionInterface $parent
73
	 * @param  ConditionInterface $child
74
	 * @return ConditionInterface
75
	 */
76
	protected function mergeConditions( $parent, $child ) {
77
		if ( $parent instanceof UrlCondition ) {
78
			if ( $child instanceof UrlCondition ) {
79
				return $parent->concatenate( $child );
80
			}
81
		}
82
83
		return new MultipleCondition( [$parent, $child] );
84
	}
85
86
	/**
87
	 * {@inheritDoc}
88
	 */
89
	public function isSatisfied( Request $request ) {
90
		$route = $this->getSatisfiedRoute( $request );
91
		return $route !== null;
92
	}
93
94
	/**
95
	 * {@inheritDoc}
96
	 */
97
	public function handle( Request $request, $view ) {
98
		$route = $this->getSatisfiedRoute( $request );
99
		return $route ? $route->handle( $request, $view ) : null;
100
	}
101
102
	/**
103
	 * {@inheritDoc}
104
	 */
105
	public function getArguments( Request $request ) {
106
		$route = $this->getSatisfiedRoute( $request );
107
		return $route ? $route->getArguments( $request ) : [];
108
	}
109
110
	/**
111
	 * {@inheritDoc}
112
	 */
113
	public function route( $methods, $condition, $handler ) {
114
		if ( ! $condition instanceof ConditionInterface ) {
115
			$condition = RouteCondition::make( $condition );
116
		}
117
118
		if ( $this->condition !== null ) {
119
			$condition = $this->mergeConditions($this->condition, $condition);
120
		}
121
122
		return $this->traitRoute( $methods, $condition, $handler );
123
	}
124
125
	/**
126
	 * {@inheritDoc}
127
	 */
128
	public function group( $condition, $routes = null ) {
129
		list( $condition, $routes ) = Arguments::flip( $condition, $routes );
130
131
		if ( $condition !== null && ! $condition instanceof ConditionInterface ) {
132
			$condition = RouteCondition::make( $condition );
133
		}
134
135
		if ( $this->condition !== null ) {
136
			$condition = $this->mergeConditions( $this->condition, $condition );
137
		}
138
139
		return $this->traitGroup( $condition, $routes );
140
	}
141
142
	/**
143
	 * {@inheritDoc}
144
	 */
145
	public function addMiddleware( $middleware ) {
146
		$routes = $this->getRoutes();
147
148
		foreach ( $routes as $route ) {
149
			$route->addMiddleware( $middleware );
150
		}
151
152
		return $this->traitAddMiddleware( $middleware );
153
	}
154
}
155