Test Failed
Branch dev (494019)
by Alex
03:13
created
src/Resource.php 2 patches
Indentation   +158 added lines, -158 removed lines patch added patch discarded remove patch
@@ -20,163 +20,163 @@
 block discarded – undo
20 20
 class Resource extends Group
21 21
 {
22 22
 
23
-    /**
24
-     * @inheritdoc
25
-     * @throws \BadMethodCallException
26
-     */
27
-
28
-    public function setMethod($method)
29
-    {
30
-        throw new \BadMethodCallException("Resources can't chance they http method.");
31
-    }
32
-
33
-    /**
34
-     * Remove the routes without the passed methods.
35
-     *
36
-     * @param string|array $methods
37
-     * @return self
38
-     */
39
-
40
-    public function only($methods)
41
-    {
42
-        $this->filterByMethod((array) $methods, false);
43
-        return $this;
44
-    }
45
-
46
-    /**
47
-     * Remove the routes with the passed methods.
48
-     *
49
-     * @param string|array $methods
50
-     * @return self
51
-     */
52
-
53
-    public function except($methods)
54
-    {
55
-        $this->filterByMethod((array) $methods, true);
56
-        return $this;
57
-    }
58
-
59
-    /**
60
-     * Forget the grouped routes filtering by http methods.
61
-     *
62
-     * @param array $methods
63
-     * @param bool $alt Should remove?
64
-     */
65
-
66
-    private function filterByMethod(array $methods, $alt)
67
-    {
68
-        $methods = array_flip(array_map('strtolower', $methods));
69
-
70
-        foreach ($this->routes as $route) {
71
-            if (isset($methods[$route->getAction()[1]]) === $alt) {
72
-                $route->forget();
73
-            }
74
-        }
75
-    }
76
-
77
-    /**
78
-     * Translate the "make" or "edit" from resources path.
79
-     *
80
-     * @param string[] $translations
81
-     * @return self
82
-     */
83
-
84
-    public function translate(array $translations)
85
-    {
86
-        /** @var Route $route */
87
-        foreach ($this->route as $route) {
88
-            $action = $route->getAction()[1];
89
-
90
-            if ($action === "make" && isset($translations["make"])) {
91
-                $route->setPatternWithoutReset(str_replace("make", $translations["make"], $route->getPattern()));
92
-            } else {
93
-                if ($action === "edit" && isset($translations["edit"])) {
94
-                    $route->setPatternWithoutReset(str_replace("edit", $translations["edit"], $route->getPattern()));
95
-                }
96
-            }
97
-        }
98
-
99
-        return $this;
100
-    }
101
-
102
-    /**
103
-     * Add a route or a group of routes to the resource, it means that
104
-     * every added route will now receive the parameters of the resource, like id.
105
-     *
106
-     * @param Route|Group $route
107
-     * @return self
108
-     */
109
-
110
-    public function member($route)
111
-    {
112
-        $resource = new Resource;
113
-        $resource->set($route);
114
-        $this->nest($resource);
115
-    }
116
-
117
-    /**
118
-     * Nested routes capture the relation between a resource and another resource.
119
-     *
120
-     * @param Resource $resource
121
-     * @return self
122
-     */
123
-
124
-    public function nest(Resource $resource)
125
-    {
126
-        /** @var self $resource */
127
-        foreach ($this->routes as $route) {
128
-            if ($route->getAction()[1] === "show") {
129
-                $this->set($resource->forget()->setPrefix($this->getNestedPrefix($route->getPattern()))); break;
130
-            }
131
-        }
132
-
133
-        return $this;
134
-    }
135
-
136
-    /**
137
-     * Nest resources but with only build routes with the minimal amount of information
138
-     * to uniquely identify the resource.
139
-     *
140
-     * @param Resource $resource
141
-     * @return self
142
-     */
143
-
144
-    public function shallow(Resource $resource)
145
-    {
146
-        /** @var self $resource */
147
-        $newResource = new Resource;
148
-        $resource->forget();
149
-        $routes = $resource->all();
150
-
151
-        foreach ($routes as $route) {
152
-            if (strpos("index make create", $route->getAction()[1]) !== false) {
153
-                $newResource->set($route);
154
-            }
155
-        }
156
-
157
-        return $this->nest($newResource);
158
-    }
159
-
160
-    /**
161
-     * Resolve the nesting pattern, setting the prefixes based on
162
-     * parent resources patterns.
163
-     *
164
-     * @param string $pattern
165
-     * @return string
166
-     */
167
-
168
-    protected function getNestedPrefix($pattern)
169
-    {
170
-        $segments = explode("/", $pattern);
171
-        $pattern = "";
172
-
173
-        foreach ($segments as $index => $segment) {
174
-            if (strpos($segment, "{") === 0) {
175
-                   $pattern .= "/{" . $segments[$index - 1] . "_" . ltrim($segment, "{");
176
-            } else $pattern .= $segment;
177
-        }
178
-
179
-        return $pattern;
180
-    }
23
+	/**
24
+	 * @inheritdoc
25
+	 * @throws \BadMethodCallException
26
+	 */
27
+
28
+	public function setMethod($method)
29
+	{
30
+		throw new \BadMethodCallException("Resources can't chance they http method.");
31
+	}
32
+
33
+	/**
34
+	 * Remove the routes without the passed methods.
35
+	 *
36
+	 * @param string|array $methods
37
+	 * @return self
38
+	 */
39
+
40
+	public function only($methods)
41
+	{
42
+		$this->filterByMethod((array) $methods, false);
43
+		return $this;
44
+	}
45
+
46
+	/**
47
+	 * Remove the routes with the passed methods.
48
+	 *
49
+	 * @param string|array $methods
50
+	 * @return self
51
+	 */
52
+
53
+	public function except($methods)
54
+	{
55
+		$this->filterByMethod((array) $methods, true);
56
+		return $this;
57
+	}
58
+
59
+	/**
60
+	 * Forget the grouped routes filtering by http methods.
61
+	 *
62
+	 * @param array $methods
63
+	 * @param bool $alt Should remove?
64
+	 */
65
+
66
+	private function filterByMethod(array $methods, $alt)
67
+	{
68
+		$methods = array_flip(array_map('strtolower', $methods));
69
+
70
+		foreach ($this->routes as $route) {
71
+			if (isset($methods[$route->getAction()[1]]) === $alt) {
72
+				$route->forget();
73
+			}
74
+		}
75
+	}
76
+
77
+	/**
78
+	 * Translate the "make" or "edit" from resources path.
79
+	 *
80
+	 * @param string[] $translations
81
+	 * @return self
82
+	 */
83
+
84
+	public function translate(array $translations)
85
+	{
86
+		/** @var Route $route */
87
+		foreach ($this->route as $route) {
88
+			$action = $route->getAction()[1];
89
+
90
+			if ($action === "make" && isset($translations["make"])) {
91
+				$route->setPatternWithoutReset(str_replace("make", $translations["make"], $route->getPattern()));
92
+			} else {
93
+				if ($action === "edit" && isset($translations["edit"])) {
94
+					$route->setPatternWithoutReset(str_replace("edit", $translations["edit"], $route->getPattern()));
95
+				}
96
+			}
97
+		}
98
+
99
+		return $this;
100
+	}
101
+
102
+	/**
103
+	 * Add a route or a group of routes to the resource, it means that
104
+	 * every added route will now receive the parameters of the resource, like id.
105
+	 *
106
+	 * @param Route|Group $route
107
+	 * @return self
108
+	 */
109
+
110
+	public function member($route)
111
+	{
112
+		$resource = new Resource;
113
+		$resource->set($route);
114
+		$this->nest($resource);
115
+	}
116
+
117
+	/**
118
+	 * Nested routes capture the relation between a resource and another resource.
119
+	 *
120
+	 * @param Resource $resource
121
+	 * @return self
122
+	 */
123
+
124
+	public function nest(Resource $resource)
125
+	{
126
+		/** @var self $resource */
127
+		foreach ($this->routes as $route) {
128
+			if ($route->getAction()[1] === "show") {
129
+				$this->set($resource->forget()->setPrefix($this->getNestedPrefix($route->getPattern()))); break;
130
+			}
131
+		}
132
+
133
+		return $this;
134
+	}
135
+
136
+	/**
137
+	 * Nest resources but with only build routes with the minimal amount of information
138
+	 * to uniquely identify the resource.
139
+	 *
140
+	 * @param Resource $resource
141
+	 * @return self
142
+	 */
143
+
144
+	public function shallow(Resource $resource)
145
+	{
146
+		/** @var self $resource */
147
+		$newResource = new Resource;
148
+		$resource->forget();
149
+		$routes = $resource->all();
150
+
151
+		foreach ($routes as $route) {
152
+			if (strpos("index make create", $route->getAction()[1]) !== false) {
153
+				$newResource->set($route);
154
+			}
155
+		}
156
+
157
+		return $this->nest($newResource);
158
+	}
159
+
160
+	/**
161
+	 * Resolve the nesting pattern, setting the prefixes based on
162
+	 * parent resources patterns.
163
+	 *
164
+	 * @param string $pattern
165
+	 * @return string
166
+	 */
167
+
168
+	protected function getNestedPrefix($pattern)
169
+	{
170
+		$segments = explode("/", $pattern);
171
+		$pattern = "";
172
+
173
+		foreach ($segments as $index => $segment) {
174
+			if (strpos($segment, "{") === 0) {
175
+				   $pattern .= "/{" . $segments[$index - 1] . "_" . ltrim($segment, "{");
176
+			} else $pattern .= $segment;
177
+		}
178
+
179
+		return $pattern;
180
+	}
181 181
 
182 182
 }
Please login to merge, or discard this patch.
Braces   +3 added lines, -1 removed lines patch added patch discarded remove patch
@@ -173,7 +173,9 @@
 block discarded – undo
173 173
         foreach ($segments as $index => $segment) {
174 174
             if (strpos($segment, "{") === 0) {
175 175
                    $pattern .= "/{" . $segments[$index - 1] . "_" . ltrim($segment, "{");
176
-            } else $pattern .= $segment;
176
+            } else {
177
+            	$pattern .= $segment;
178
+            }
177 179
         }
178 180
 
179 181
         return $pattern;
Please login to merge, or discard this patch.
src/Route.php 3 patches
Indentation   +525 added lines, -525 removed lines patch added patch discarded remove patch
@@ -23,538 +23,538 @@
 block discarded – undo
23 23
 class Route
24 24
 {
25 25
 
26
-    /**
27
-     * @var Collector
28
-     */
26
+	/**
27
+	 * @var Collector
28
+	 */
29 29
 
30
-    protected $collector;
30
+	protected $collector;
31 31
     
32
-    /**
33
-     * @var string
34
-     */
32
+	/**
33
+	 * @var string
34
+	 */
35 35
 
36
-    protected $method;
36
+	protected $method;
37 37
     
38
-    /**
39
-     * @var string
40
-     */
38
+	/**
39
+	 * @var string
40
+	 */
41 41
 
42
-    protected $pattern;
42
+	protected $pattern;
43 43
     
44
-    /**
45
-     * @var string|array|\Closure
46
-     */
44
+	/**
45
+	 * @var string|array|\Closure
46
+	 */
47 47
 
48
-    protected $action;
48
+	protected $action;
49 49
     
50
-    /**
51
-     * @var string
52
-     */
53
-
54
-    protected $namespace;
55
-
56
-    /**
57
-     * @var string[]
58
-     */
59
-
60
-    protected $params;
61
-
62
-    /**
63
-     * Defaults are parameters set by the user, and don't
64
-     * appear on the pattern.
65
-     *
66
-     * @var array
67
-     */
68
-
69
-    protected $defaults;
70
-
71
-    /**
72
-     * Metadata can be set to be used on filters, dispatch strategies
73
-     * or anywhere the route object is used.
74
-     *
75
-     * @var array
76
-     */
77
-
78
-    protected $metadata;
79
-
80
-    /**
81
-     * @var string|StrategyInterface
82
-     */
83
-
84
-    protected $strategy;
85
-
86
-    /**
87
-     * Blocked routes are dynamic routes selected to pass by the matcher.
88
-     *
89
-     * @var boolean
90
-     */
91
-
92
-    protected $blocked;
93
-
94
-    /**
95
-     * The matcher that dispatched this route.
96
-     *
97
-     * @var Matcher $matcher
98
-     */
99
-
100
-    protected $matcher;
101
-
102
-    /**
103
-     * @param Collector $collector
104
-     * @param string $method
105
-     * @param string $pattern
106
-     * @param string|array|\Closure $action
107
-     */
108
-
109
-    public function __construct(Collector $collector, $method, $pattern, $action)
110
-    {
111
-        $this->collector = $collector;
112
-        $this->method    = $method;
113
-        $this->pattern   = $pattern;
114
-        $this->action    = $action;
115
-        $this->namespace = "";
116
-        $this->params    = [];
117
-        $this->defaults  = [];
118
-        $this->metadata  = [];
119
-        $this->strategy  = null;
120
-        $this->blocked   = false;
121
-    }
122
-
123
-    /**
124
-     * Clone this route and set it into the collector.
125
-     *
126
-     * @return Route
127
-     */
128
-
129
-    public function reset()
130
-    {
131
-        return $this->collector->set($this->method, $this->pattern, $this->action)->nth(0)
132
-                               ->setStrategy($this->strategy)->setParams($this->params)
133
-                               ->setDefaults($this->defaults)->setMetadataArray($this->metadata);
134
-    }
135
-
136
-    /**
137
-     * Remove this route from the collector.
138
-     *
139
-     * @return self
140
-     */
141
-
142
-    public function forget()
143
-    {
144
-        $this->collector->forget($this->method, $this->pattern);
145
-        return $this;
146
-    }
147
-
148
-    /**
149
-     * Blocking a route indicate that that route have been selected and
150
-     * parsed, now it will be given to the matcher.
151
-     *
152
-     * @return self
153
-     */
154
-
155
-    public function block()
156
-    {
157
-        $this->blocked = true;
158
-        return $this;
159
-    }
160
-
161
-    /**
162
-     * Verify if a Route have already been blocked.
163
-     *
164
-     * @return boolean
165
-     */
166
-
167
-    public function blocked()
168
-    {
169
-        return $this->blocked;
170
-    }
171
-
172
-    /**
173
-     * Execute the route action, if no strategy was provided the action
174
-     * will be executed by the call_user_func PHP function.
175
-     *
176
-     * @throws BadRouteException
177
-     * @return mixed
178
-     */
179
-
180
-    public function call()
181
-    {
182
-        $this->action = $this->parseCallable($this->action);
183
-
184
-        if ($this->strategy === null) {
185
-            return call_user_func_array($this->action, array_merge($this->defaults, $this->params));
186
-        }
187
-
188
-        if (!is_object($this->strategy)) {
189
-            $strategy = new $this->strategy;
190
-
191
-            if ($strategy instanceof StrategyInterface) {
192
-                if ($strategy instanceof MatcherAwareInterface) {
193
-                    $strategy->setMatcher($this->matcher);
194
-                }
195
-
196
-                return $strategy->call($this);
197
-            }
198
-        }
199
-
200
-        throw new BadRouteException("`$this->strategy` is not a valid route dispatch strategy, ".
201
-                                    "it must implement the `Codeburner\Router\Strategies\StrategyInterface` interface.");
202
-    }
203
-
204
-    /**
205
-     * Seek for dynamic content on callables. eg. routes action controller#action
206
-     * syntax allow to use the variables to build the string like: {controller}@{action}
207
-     *
208
-     * @param string|array|\Closure $callable
209
-     * @return string|array|\Closure
210
-     */
211
-
212
-    private function parseCallable($callable)
213
-    {
214
-        if (is_string($callable) && strpos($callable, "@")) {
215
-            $callable = explode("@", $callable);
216
-        }
217
-
218
-        if (is_array($callable)) {
219
-            if (is_string($callable[0])) {
220
-                   $callable[0] = rtrim($this->namespace, "\\") . "\\" . $this->parseCallablePlaceholders($callable[0]);
221
-                   $callable[1] = $this->parseCallablePlaceholders($callable[1]);
222
-            } else $callable[1] = $this->parseCallablePlaceholders($callable[1]);
223
-        }
224
-
225
-        return $callable;
226
-    }
227
-
228
-    /**
229
-     * Parse and replace dynamic content on route action.
230
-     *
231
-     * @param  string $fragment Part of callable
232
-     * @return string
233
-     */
234
-
235
-    private function parseCallablePlaceholders($fragment)
236
-    {
237
-        if (strpos($fragment, "{") !== false) {
238
-            foreach ($this->params as $placeholder => $value) {
239
-                if (strpos($fragment, "{" . $placeholder . "}") !== false) {
240
-                    $fragment = str_replace("{" . $placeholder . "}", ucwords(str_replace("-", " ", $value)), $fragment);
241
-                }
242
-            }
243
-        }
244
-
245
-        return $fragment;
246
-    }
247
-
248
-    /**
249
-     * @return Collector
250
-     */
251
-
252
-    public function getCollector()
253
-    {
254
-        return $this->collector;
255
-    }
256
-
257
-    /**
258
-     * @return string
259
-     */
260
-
261
-    public function getMethod()
262
-    {
263
-        return $this->method;
264
-    }
265
-
266
-    /**
267
-     * @return string
268
-     */
269
-
270
-    public function getPattern()
271
-    {
272
-        return $this->pattern;
273
-    }
274
-
275
-    /**
276
-     * @return string[]
277
-     */
278
-
279
-    public function getSegments()
280
-    {
281
-        return explode("/", $this->pattern);
282
-    }
283
-
284
-    /**
285
-     * @return string|array|\Closure
286
-     */
287
-
288
-    public function getAction()
289
-    {
290
-        return $this->action;
291
-    }
292
-
293
-    /**
294
-     * @return string
295
-     */
296
-
297
-    public function getNamespace()
298
-    {
299
-        return $this->namespace;
300
-    }
301
-
302
-    /**
303
-     * @return string[]
304
-     */
305
-
306
-    public function getParams()
307
-    {
308
-        return $this->params;
309
-    }
310
-
311
-    /**
312
-     * @param string $key
313
-     * @return string
314
-     */
315
-
316
-    public function getParam($key)
317
-    {
318
-        return $this->params[$key];
319
-    }
320
-
321
-    /**
322
-     * @return array
323
-     */
324
-
325
-    public function getDefaults()
326
-    {
327
-        return $this->defaults;
328
-    }
329
-
330
-    /**
331
-     * @param string $key
332
-     * @return mixed
333
-     */
334
-
335
-    public function getDefault($key)
336
-    {
337
-        return $this->defaults[$key];
338
-    }
339
-
340
-    /**
341
-     * @return array
342
-     */
343
-
344
-    public function getMetadataArray()
345
-    {
346
-        return $this->metadata;
347
-    }
348
-
349
-    /**
350
-     * @param string $key
351
-     * @return mixed
352
-     */
353
-
354
-    public function getMetadata($key)
355
-    {
356
-        return $this->metadata[$key];
357
-    }
358
-
359
-    /**
360
-     * @return string|null
361
-     */
362
-
363
-    public function getStrategy()
364
-    {
365
-        if ($this->strategy instanceof StrategyInterface) {
366
-            return get_class($this->strategy);
367
-        }
368
-
369
-        return $this->strategy;
370
-    }
371
-
372
-    /**
373
-     * @inheritdoc
374
-     */
375
-
376
-    public function getMatcher()
377
-    {
378
-        return $this->matcher;
379
-    }
380
-
381
-    /**
382
-     * @param string $method
383
-     * @return Route
384
-     */
385
-
386
-    public function setMethod($method)
387
-    {
388
-        $this->forget();
389
-        $this->method = $method;
390
-        return $this->reset();
391
-    }
392
-
393
-    /**
394
-     * @param string $pattern
395
-     * @return Route
396
-     */
397
-
398
-    public function setPattern($pattern)
399
-    {
400
-        $this->forget();
401
-        $this->pattern = $pattern;
402
-        return $this->reset();
403
-    }
404
-
405
-    /**
406
-     * @param string $pattern
407
-     * @return self
408
-     */
409
-
410
-    public function setPatternWithoutReset($pattern)
411
-    {
412
-        $this->pattern = $pattern;
413
-        return $this;
414
-    }
415
-
416
-    /**
417
-     * @param string $action
418
-     * @return self
419
-     */
420
-
421
-    public function setAction($action)
422
-    {
423
-        $this->action = $action;
424
-        return $this;
425
-    }
426
-
427
-    /**
428
-     * @param string $namespace
429
-     * @return self
430
-     */
431
-
432
-    public function setNamespace($namespace)
433
-    {
434
-        $this->namespace = $namespace;
435
-        return $this;
436
-    }
437
-
438
-    /**
439
-     * @param string[] $params
440
-     * @return self
441
-     */
442
-
443
-    public function setParams(array $params)
444
-    {
445
-        $this->params = $params;
446
-        return $this;
447
-    }
448
-
449
-    /**
450
-     * @param string $key
451
-     * @param string $value
452
-     *
453
-     * @return self
454
-     */
455
-
456
-    public function setParam($key, $value)
457
-    {
458
-        $this->params[$key] = $value;
459
-        return $this;
460
-    }
461
-
462
-    /**
463
-     * @param mixed[] $defaults
464
-     * @return self
465
-     */
466
-
467
-    public function setDefaults(array $defaults)
468
-    {
469
-        $this->defaults = $defaults;
470
-        return $this;
471
-    }
472
-
473
-    /**
474
-     * @param string $key
475
-     * @param mixed $value
476
-     *
477
-     * @return self
478
-     */
479
-
480
-    public function setDefault($key, $value)
481
-    {
482
-        $this->defaults[$key] = $value;
483
-        return $this;
484
-    }
485
-
486
-    /**
487
-     * @param mixed[] $metadata
488
-     * @return self
489
-     */
490
-
491
-    public function setMetadataArray(array $metadata)
492
-    {
493
-        $this->metadata = $metadata;
494
-        return $this;
495
-    }
496
-
497
-    /**
498
-     * @param string $key
499
-     * @param mixed $value
500
-     *
501
-     * @return $this
502
-     */
503
-
504
-    public function setMetadata($key, $value)
505
-    {
506
-        $this->metadata[$key] = $value;
507
-        return $this;
508
-    }
509
-
510
-    /**
511
-     * @param string|StrategyInterface $strategy
512
-     * @return self
513
-     */
514
-
515
-    public function setStrategy($strategy)
516
-    {
517
-        $this->strategy = $strategy;
518
-        return $this;
519
-    }
520
-
521
-    /**
522
-     * @inheritdoc
523
-     */
524
-
525
-    public function setMatcher(Matcher $matcher)
526
-    {
527
-        $this->matcher = $matcher;
528
-    }
529
-
530
-    /**
531
-     * @param string $key
532
-     * @return bool
533
-     */
534
-
535
-    public function hasParam($key)
536
-    {
537
-        return isset($this->params[$key]);
538
-    }
539
-
540
-    /**
541
-     * @param string $key
542
-     * @return bool
543
-     */
544
-
545
-    public function hasDefault($key)
546
-    {
547
-        return isset($this->defaults[$key]);
548
-    }
549
-
550
-    /**
551
-     * @param string $key
552
-     * @return bool
553
-     */
554
-
555
-    public function hasMetadata($key)
556
-    {
557
-        return isset($this->metadata[$key]);
558
-    }
50
+	/**
51
+	 * @var string
52
+	 */
53
+
54
+	protected $namespace;
55
+
56
+	/**
57
+	 * @var string[]
58
+	 */
59
+
60
+	protected $params;
61
+
62
+	/**
63
+	 * Defaults are parameters set by the user, and don't
64
+	 * appear on the pattern.
65
+	 *
66
+	 * @var array
67
+	 */
68
+
69
+	protected $defaults;
70
+
71
+	/**
72
+	 * Metadata can be set to be used on filters, dispatch strategies
73
+	 * or anywhere the route object is used.
74
+	 *
75
+	 * @var array
76
+	 */
77
+
78
+	protected $metadata;
79
+
80
+	/**
81
+	 * @var string|StrategyInterface
82
+	 */
83
+
84
+	protected $strategy;
85
+
86
+	/**
87
+	 * Blocked routes are dynamic routes selected to pass by the matcher.
88
+	 *
89
+	 * @var boolean
90
+	 */
91
+
92
+	protected $blocked;
93
+
94
+	/**
95
+	 * The matcher that dispatched this route.
96
+	 *
97
+	 * @var Matcher $matcher
98
+	 */
99
+
100
+	protected $matcher;
101
+
102
+	/**
103
+	 * @param Collector $collector
104
+	 * @param string $method
105
+	 * @param string $pattern
106
+	 * @param string|array|\Closure $action
107
+	 */
108
+
109
+	public function __construct(Collector $collector, $method, $pattern, $action)
110
+	{
111
+		$this->collector = $collector;
112
+		$this->method    = $method;
113
+		$this->pattern   = $pattern;
114
+		$this->action    = $action;
115
+		$this->namespace = "";
116
+		$this->params    = [];
117
+		$this->defaults  = [];
118
+		$this->metadata  = [];
119
+		$this->strategy  = null;
120
+		$this->blocked   = false;
121
+	}
122
+
123
+	/**
124
+	 * Clone this route and set it into the collector.
125
+	 *
126
+	 * @return Route
127
+	 */
128
+
129
+	public function reset()
130
+	{
131
+		return $this->collector->set($this->method, $this->pattern, $this->action)->nth(0)
132
+							   ->setStrategy($this->strategy)->setParams($this->params)
133
+							   ->setDefaults($this->defaults)->setMetadataArray($this->metadata);
134
+	}
135
+
136
+	/**
137
+	 * Remove this route from the collector.
138
+	 *
139
+	 * @return self
140
+	 */
141
+
142
+	public function forget()
143
+	{
144
+		$this->collector->forget($this->method, $this->pattern);
145
+		return $this;
146
+	}
147
+
148
+	/**
149
+	 * Blocking a route indicate that that route have been selected and
150
+	 * parsed, now it will be given to the matcher.
151
+	 *
152
+	 * @return self
153
+	 */
154
+
155
+	public function block()
156
+	{
157
+		$this->blocked = true;
158
+		return $this;
159
+	}
160
+
161
+	/**
162
+	 * Verify if a Route have already been blocked.
163
+	 *
164
+	 * @return boolean
165
+	 */
166
+
167
+	public function blocked()
168
+	{
169
+		return $this->blocked;
170
+	}
171
+
172
+	/**
173
+	 * Execute the route action, if no strategy was provided the action
174
+	 * will be executed by the call_user_func PHP function.
175
+	 *
176
+	 * @throws BadRouteException
177
+	 * @return mixed
178
+	 */
179
+
180
+	public function call()
181
+	{
182
+		$this->action = $this->parseCallable($this->action);
183
+
184
+		if ($this->strategy === null) {
185
+			return call_user_func_array($this->action, array_merge($this->defaults, $this->params));
186
+		}
187
+
188
+		if (!is_object($this->strategy)) {
189
+			$strategy = new $this->strategy;
190
+
191
+			if ($strategy instanceof StrategyInterface) {
192
+				if ($strategy instanceof MatcherAwareInterface) {
193
+					$strategy->setMatcher($this->matcher);
194
+				}
195
+
196
+				return $strategy->call($this);
197
+			}
198
+		}
199
+
200
+		throw new BadRouteException("`$this->strategy` is not a valid route dispatch strategy, ".
201
+									"it must implement the `Codeburner\Router\Strategies\StrategyInterface` interface.");
202
+	}
203
+
204
+	/**
205
+	 * Seek for dynamic content on callables. eg. routes action controller#action
206
+	 * syntax allow to use the variables to build the string like: {controller}@{action}
207
+	 *
208
+	 * @param string|array|\Closure $callable
209
+	 * @return string|array|\Closure
210
+	 */
211
+
212
+	private function parseCallable($callable)
213
+	{
214
+		if (is_string($callable) && strpos($callable, "@")) {
215
+			$callable = explode("@", $callable);
216
+		}
217
+
218
+		if (is_array($callable)) {
219
+			if (is_string($callable[0])) {
220
+				   $callable[0] = rtrim($this->namespace, "\\") . "\\" . $this->parseCallablePlaceholders($callable[0]);
221
+				   $callable[1] = $this->parseCallablePlaceholders($callable[1]);
222
+			} else $callable[1] = $this->parseCallablePlaceholders($callable[1]);
223
+		}
224
+
225
+		return $callable;
226
+	}
227
+
228
+	/**
229
+	 * Parse and replace dynamic content on route action.
230
+	 *
231
+	 * @param  string $fragment Part of callable
232
+	 * @return string
233
+	 */
234
+
235
+	private function parseCallablePlaceholders($fragment)
236
+	{
237
+		if (strpos($fragment, "{") !== false) {
238
+			foreach ($this->params as $placeholder => $value) {
239
+				if (strpos($fragment, "{" . $placeholder . "}") !== false) {
240
+					$fragment = str_replace("{" . $placeholder . "}", ucwords(str_replace("-", " ", $value)), $fragment);
241
+				}
242
+			}
243
+		}
244
+
245
+		return $fragment;
246
+	}
247
+
248
+	/**
249
+	 * @return Collector
250
+	 */
251
+
252
+	public function getCollector()
253
+	{
254
+		return $this->collector;
255
+	}
256
+
257
+	/**
258
+	 * @return string
259
+	 */
260
+
261
+	public function getMethod()
262
+	{
263
+		return $this->method;
264
+	}
265
+
266
+	/**
267
+	 * @return string
268
+	 */
269
+
270
+	public function getPattern()
271
+	{
272
+		return $this->pattern;
273
+	}
274
+
275
+	/**
276
+	 * @return string[]
277
+	 */
278
+
279
+	public function getSegments()
280
+	{
281
+		return explode("/", $this->pattern);
282
+	}
283
+
284
+	/**
285
+	 * @return string|array|\Closure
286
+	 */
287
+
288
+	public function getAction()
289
+	{
290
+		return $this->action;
291
+	}
292
+
293
+	/**
294
+	 * @return string
295
+	 */
296
+
297
+	public function getNamespace()
298
+	{
299
+		return $this->namespace;
300
+	}
301
+
302
+	/**
303
+	 * @return string[]
304
+	 */
305
+
306
+	public function getParams()
307
+	{
308
+		return $this->params;
309
+	}
310
+
311
+	/**
312
+	 * @param string $key
313
+	 * @return string
314
+	 */
315
+
316
+	public function getParam($key)
317
+	{
318
+		return $this->params[$key];
319
+	}
320
+
321
+	/**
322
+	 * @return array
323
+	 */
324
+
325
+	public function getDefaults()
326
+	{
327
+		return $this->defaults;
328
+	}
329
+
330
+	/**
331
+	 * @param string $key
332
+	 * @return mixed
333
+	 */
334
+
335
+	public function getDefault($key)
336
+	{
337
+		return $this->defaults[$key];
338
+	}
339
+
340
+	/**
341
+	 * @return array
342
+	 */
343
+
344
+	public function getMetadataArray()
345
+	{
346
+		return $this->metadata;
347
+	}
348
+
349
+	/**
350
+	 * @param string $key
351
+	 * @return mixed
352
+	 */
353
+
354
+	public function getMetadata($key)
355
+	{
356
+		return $this->metadata[$key];
357
+	}
358
+
359
+	/**
360
+	 * @return string|null
361
+	 */
362
+
363
+	public function getStrategy()
364
+	{
365
+		if ($this->strategy instanceof StrategyInterface) {
366
+			return get_class($this->strategy);
367
+		}
368
+
369
+		return $this->strategy;
370
+	}
371
+
372
+	/**
373
+	 * @inheritdoc
374
+	 */
375
+
376
+	public function getMatcher()
377
+	{
378
+		return $this->matcher;
379
+	}
380
+
381
+	/**
382
+	 * @param string $method
383
+	 * @return Route
384
+	 */
385
+
386
+	public function setMethod($method)
387
+	{
388
+		$this->forget();
389
+		$this->method = $method;
390
+		return $this->reset();
391
+	}
392
+
393
+	/**
394
+	 * @param string $pattern
395
+	 * @return Route
396
+	 */
397
+
398
+	public function setPattern($pattern)
399
+	{
400
+		$this->forget();
401
+		$this->pattern = $pattern;
402
+		return $this->reset();
403
+	}
404
+
405
+	/**
406
+	 * @param string $pattern
407
+	 * @return self
408
+	 */
409
+
410
+	public function setPatternWithoutReset($pattern)
411
+	{
412
+		$this->pattern = $pattern;
413
+		return $this;
414
+	}
415
+
416
+	/**
417
+	 * @param string $action
418
+	 * @return self
419
+	 */
420
+
421
+	public function setAction($action)
422
+	{
423
+		$this->action = $action;
424
+		return $this;
425
+	}
426
+
427
+	/**
428
+	 * @param string $namespace
429
+	 * @return self
430
+	 */
431
+
432
+	public function setNamespace($namespace)
433
+	{
434
+		$this->namespace = $namespace;
435
+		return $this;
436
+	}
437
+
438
+	/**
439
+	 * @param string[] $params
440
+	 * @return self
441
+	 */
442
+
443
+	public function setParams(array $params)
444
+	{
445
+		$this->params = $params;
446
+		return $this;
447
+	}
448
+
449
+	/**
450
+	 * @param string $key
451
+	 * @param string $value
452
+	 *
453
+	 * @return self
454
+	 */
455
+
456
+	public function setParam($key, $value)
457
+	{
458
+		$this->params[$key] = $value;
459
+		return $this;
460
+	}
461
+
462
+	/**
463
+	 * @param mixed[] $defaults
464
+	 * @return self
465
+	 */
466
+
467
+	public function setDefaults(array $defaults)
468
+	{
469
+		$this->defaults = $defaults;
470
+		return $this;
471
+	}
472
+
473
+	/**
474
+	 * @param string $key
475
+	 * @param mixed $value
476
+	 *
477
+	 * @return self
478
+	 */
479
+
480
+	public function setDefault($key, $value)
481
+	{
482
+		$this->defaults[$key] = $value;
483
+		return $this;
484
+	}
485
+
486
+	/**
487
+	 * @param mixed[] $metadata
488
+	 * @return self
489
+	 */
490
+
491
+	public function setMetadataArray(array $metadata)
492
+	{
493
+		$this->metadata = $metadata;
494
+		return $this;
495
+	}
496
+
497
+	/**
498
+	 * @param string $key
499
+	 * @param mixed $value
500
+	 *
501
+	 * @return $this
502
+	 */
503
+
504
+	public function setMetadata($key, $value)
505
+	{
506
+		$this->metadata[$key] = $value;
507
+		return $this;
508
+	}
509
+
510
+	/**
511
+	 * @param string|StrategyInterface $strategy
512
+	 * @return self
513
+	 */
514
+
515
+	public function setStrategy($strategy)
516
+	{
517
+		$this->strategy = $strategy;
518
+		return $this;
519
+	}
520
+
521
+	/**
522
+	 * @inheritdoc
523
+	 */
524
+
525
+	public function setMatcher(Matcher $matcher)
526
+	{
527
+		$this->matcher = $matcher;
528
+	}
529
+
530
+	/**
531
+	 * @param string $key
532
+	 * @return bool
533
+	 */
534
+
535
+	public function hasParam($key)
536
+	{
537
+		return isset($this->params[$key]);
538
+	}
539
+
540
+	/**
541
+	 * @param string $key
542
+	 * @return bool
543
+	 */
544
+
545
+	public function hasDefault($key)
546
+	{
547
+		return isset($this->defaults[$key]);
548
+	}
549
+
550
+	/**
551
+	 * @param string $key
552
+	 * @return bool
553
+	 */
554
+
555
+	public function hasMetadata($key)
556
+	{
557
+		return isset($this->metadata[$key]);
558
+	}
559 559
 
560 560
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -197,7 +197,7 @@
 block discarded – undo
197 197
             }
198 198
         }
199 199
 
200
-        throw new BadRouteException("`$this->strategy` is not a valid route dispatch strategy, ".
200
+        throw new BadRouteException("`$this->strategy` is not a valid route dispatch strategy, " .
201 201
                                     "it must implement the `Codeburner\Router\Strategies\StrategyInterface` interface.");
202 202
     }
203 203
 
Please login to merge, or discard this patch.
Braces   +3 added lines, -1 removed lines patch added patch discarded remove patch
@@ -219,7 +219,9 @@
 block discarded – undo
219 219
             if (is_string($callable[0])) {
220 220
                    $callable[0] = rtrim($this->namespace, "\\") . "\\" . $this->parseCallablePlaceholders($callable[0]);
221 221
                    $callable[1] = $this->parseCallablePlaceholders($callable[1]);
222
-            } else $callable[1] = $this->parseCallablePlaceholders($callable[1]);
222
+            } else {
223
+            	$callable[1] = $this->parseCallablePlaceholders($callable[1]);
224
+            }
223 225
         }
224 226
 
225 227
         return $callable;
Please login to merge, or discard this patch.
src/Strategies/EnhancerAbstractStrategy.php 2 patches
Indentation   +32 added lines, -32 removed lines patch added patch discarded remove patch
@@ -24,37 +24,37 @@
 block discarded – undo
24 24
 abstract class EnhancerAbstractStrategy implements StrategyInterface
25 25
 {
26 26
 
27
-    /**
28
-     * Key used to store the real route strategy on metadata.
29
-     *
30
-     * @var string
31
-     */
32
-
33
-    protected $metadataStrategyKey = "strategy";
34
-
35
-    /**
36
-     * @inheritdoc
37
-     * @throws BadRouteException
38
-     */
39
-
40
-    public function call(Route $route)
41
-    {
42
-        if ($route->hasMetadata($this->metadataStrategyKey)) {
43
-               $route->setStrategy($route->getMetadata($this->metadataStrategyKey));
44
-        } else $route->setStrategy(null);
45
-
46
-        $this->enhance($route);
47
-
48
-        return $route->call();
49
-    }
50
-
51
-    /**
52
-     * Manipulate route object before the dispatch.
53
-     *
54
-     * @param Route $route
55
-     * @return mixed
56
-     */
57
-
58
-    abstract public function enhance(Route $route);
27
+	/**
28
+	 * Key used to store the real route strategy on metadata.
29
+	 *
30
+	 * @var string
31
+	 */
32
+
33
+	protected $metadataStrategyKey = "strategy";
34
+
35
+	/**
36
+	 * @inheritdoc
37
+	 * @throws BadRouteException
38
+	 */
39
+
40
+	public function call(Route $route)
41
+	{
42
+		if ($route->hasMetadata($this->metadataStrategyKey)) {
43
+			   $route->setStrategy($route->getMetadata($this->metadataStrategyKey));
44
+		} else $route->setStrategy(null);
45
+
46
+		$this->enhance($route);
47
+
48
+		return $route->call();
49
+	}
50
+
51
+	/**
52
+	 * Manipulate route object before the dispatch.
53
+	 *
54
+	 * @param Route $route
55
+	 * @return mixed
56
+	 */
57
+
58
+	abstract public function enhance(Route $route);
59 59
 
60 60
 }
Please login to merge, or discard this patch.
Braces   +3 added lines, -1 removed lines patch added patch discarded remove patch
@@ -41,7 +41,9 @@
 block discarded – undo
41 41
     {
42 42
         if ($route->hasMetadata($this->metadataStrategyKey)) {
43 43
                $route->setStrategy($route->getMetadata($this->metadataStrategyKey));
44
-        } else $route->setStrategy(null);
44
+        } else {
45
+        	$route->setStrategy(null);
46
+        }
45 47
 
46 48
         $this->enhance($route);
47 49
 
Please login to merge, or discard this patch.
src/Strategies/MatcherAwareInterface.php 1 patch
Indentation   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -20,16 +20,16 @@
 block discarded – undo
20 20
 interface MatcherAwareInterface
21 21
 {
22 22
 
23
-    /**
24
-     * @param \Codeburner\Router\Matcher $matcher
25
-     */
23
+	/**
24
+	 * @param \Codeburner\Router\Matcher $matcher
25
+	 */
26 26
 
27
-    public function setMatcher(\Codeburner\Router\Matcher $matcher);
27
+	public function setMatcher(\Codeburner\Router\Matcher $matcher);
28 28
 
29
-    /**
30
-     * @return \Codeburner\Router\Matcher
31
-     */
29
+	/**
30
+	 * @return \Codeburner\Router\Matcher
31
+	 */
32 32
 
33
-    public function getMatcher();
33
+	public function getMatcher();
34 34
 
35 35
 }
36 36
\ No newline at end of file
Please login to merge, or discard this patch.
src/Strategies/StrategyInterface.php 1 patch
Indentation   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -19,13 +19,13 @@
 block discarded – undo
19 19
 interface StrategyInterface
20 20
 {
21 21
 
22
-    /**
23
-     * Dispatch the matched route action.
24
-     *
25
-     * @param \Codeburner\Router\Route $route
26
-     * @return mixed The response of request.
27
-     */
22
+	/**
23
+	 * Dispatch the matched route action.
24
+	 *
25
+	 * @param \Codeburner\Router\Route $route
26
+	 * @return mixed The response of request.
27
+	 */
28 28
 
29
-    public function call(\Codeburner\Router\Route $route);
29
+	public function call(\Codeburner\Router\Route $route);
30 30
 
31 31
 }
Please login to merge, or discard this patch.