Passed
Push — master ( 45b34a...9eb8da )
by
unknown
01:50
created

Route::rewrite()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 14
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
cc 2
eloc 8
c 0
b 0
f 0
nc 1
nop 1
dl 0
loc 14
ccs 0
cts 10
cp 0
crap 6
rs 9.4285
1
<?php
2
3
namespace CarbonFramework\Routing;
4
5
use ReflectionClass;
6
use Exception;
7
use CarbonFramework\Url;
8
use CarbonFramework\Framework;
9
use CarbonFramework\Request;
10
use CarbonFramework\Routing\Conditions\ConditionInterface;
11
use CarbonFramework\Routing\Conditions\Url as UrlCondition;
12
use CarbonFramework\Routing\Middleware\HasMiddlewareTrait;
13
14
/**
15
 * Represent a route
16
 */
17
class Route implements RouteInterface {
18
	use HasMiddlewareTrait;
19
20
	/**
21
	 * Allowed methods
22
	 * 
23
	 * @var string[]
24
	 */
25
	protected $methods = [];
26
27
	/**
28
	 * Route target
29
	 * 
30
	 * @var ConditionInterface
31
	 */
32
	protected $target = null;
33
34
	/**
35
	 * Route handler
36
	 * 
37
	 * @var Handler|null
38
	 */
39
	protected $handler = null;
40
41
	/**
42
	 * Constructor
43
	 * 
44
	 * @param string[]        $methods
45
	 * @param mixed           $target
46
	 * @param string|\Closure $handler
47
	 */
48
	public function __construct( $methods, $target, $handler ) {
49
		if ( is_string( $target ) ) {
50
			$target = new UrlCondition( $target );
51
		}
52
53
		if ( is_array( $target ) ) {
54
			$target = $this->condition( $target );
55
		}
56
57
		if ( ! is_a( $target, ConditionInterface::class ) ) {
58
			throw new Exception( 'Route target is not a valid route string or condition.' );
59
		}
60
61
		$this->methods = $methods;
62
		$this->target = $target;
63
		$this->handler = new Handler( $handler );
64
	}
65
66
	/**
67
	 * Create and return a new condition
68
	 * 
69
	 * @param  array              $options
70
	 * @return ConditionInterface
71
	 */
72
	protected function condition( $options ) {
73
		if ( count( $options ) === 0 ) {
74
			throw new Exception( 'No condition type specified.' );
75
		}
76
77
		$condition_type = $options[0];
78
		$arguments = array_slice( $options, 1 );
79
80
		$condition_class = Framework::resolve( 'framework.routing.conditions.' . $condition_type );
81
		if ( $condition_class === null ) {
82
			throw new Exception( 'Unknown condition type specified: ' . $condition_type );
83
		}
84
85
		$reflection = new ReflectionClass( $condition_class );
86
		$condition = $reflection->newInstanceArgs( $arguments );
87
		return $condition;
88
	}
89
90
	/**
91
	 * {@inheritDoc}
92
	 */
93
	public function satisfied( Request $request ) {
94
		if ( ! in_array( $request->getMethod(), $this->methods) ) {
95
			return false;
96
		}
97
		return $this->target->satisfied( $request );
98
	}
99
100
	/**
101
	 * {@inheritDoc}
102
	 */
103
	public function handle( Request $request ) {
104
		$arguments = array_merge( [$request], $this->target->getArguments( $request ) );
105
		return $this->executeMiddleware( $this->getMiddleware(), $request, function() use ( $arguments ) {
106
			return call_user_func_array( [$this->handler, 'execute'], $arguments );
107
		} );
108
	}
109
110
	/**
111
	 * Add a rewrite rule to WordPress for url-based routes
112
	 * 
113
	 * @param  string $rewrite_to
114
	 * @return RouteInterface
115
	 */
116
	public function rewrite( $rewrite_to ) {
117
		if ( ! is_a( $this->target, UrlCondition::class ) ) {
118
			throw new Exception( 'Only routes with url targets can add rewrite rules.' );
119
		}
120
121
		$regex = $this->target->getValidationRegex( $this->target->getUrl(), false );
0 ignored issues
show
Bug introduced by
The method getValidationRegex() does not exist on CarbonFramework\Routing\...ions\ConditionInterface. It seems like you code against a sub-type of CarbonFramework\Routing\...ions\ConditionInterface such as CarbonFramework\Routing\Conditions\Url. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

121
		/** @scrutinizer ignore-call */ 
122
  $regex = $this->target->getValidationRegex( $this->target->getUrl(), false );
Loading history...
Bug introduced by
The method getUrl() does not exist on CarbonFramework\Routing\...ions\ConditionInterface. It seems like you code against a sub-type of CarbonFramework\Routing\...ions\ConditionInterface such as CarbonFramework\Routing\Conditions\Url. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

121
		$regex = $this->target->getValidationRegex( $this->target->/** @scrutinizer ignore-call */ getUrl(), false );
Loading history...
122
		$regex = preg_replace( '~^\^/~', '^', $regex ); // rewrite rules require NO leading slash
123
124
		add_filter( 'carbon_framework_routing_rewrite_rules', function( $rules ) use ( $regex, $rewrite_to ) {
125
			$rules[ $regex ] = $rewrite_to;
126
			return $rules;
127
		} );
128
129
		return $this;
130
	}
131
}
132