Skip to content

Commit 4314a65

Browse files
authored
Merge pull request #34 from bakaphp/hotfix-route-middleware-collisions
Hotfix route middleware collisions
2 parents c9f94e6 + 04be791 commit 4314a65

11 files changed

+372
-126
lines changed

src/Collection.php

+11-9
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class Collection extends PhCollection
1111
protected $route;
1212

1313
/**
14-
* Create a new instance of Collection based on Route instance
14+
* Create a new instance of Collection based on Route instance.
1515
*
1616
* @param Route $route
1717
*
@@ -21,17 +21,17 @@ final public static function fromRoute(Route $route): self
2121
{
2222
$collection = new self();
2323
$collection->route = $route;
24-
$collection->setHandler($route->getHanlder(), true);
24+
$collection->setHandler($route->getHandler(), true);
2525

2626
return $collection;
2727
}
2828

2929
/**
30-
* Return collection's middlewares
30+
* Return collection's middlewares.
3131
*
3232
* @return array
3333
*/
34-
public function getMiddlewares() : array
34+
public function getMiddlewares(): array
3535
{
3636
$middlewares = [];
3737

@@ -44,14 +44,16 @@ public function getMiddlewares() : array
4444
}
4545

4646
/**
47-
* Return a unique identifier for the current collection
47+
* Return a unique identifier for the current collection.
4848
*
4949
* @return string
5050
*/
51-
public function getCollectionIdentifier() : string
51+
public function getCollectionIdentifier(): string
5252
{
53-
return Slug::generate(
54-
$this->getHandler().'-'.$this->getHandlers()[0][2]
55-
);
53+
//$this->getHandlers()[0][0] whats the router method? GET , POST, PUT , DELETE
54+
//$this->getHandlers()[0][1] what the prefix
55+
return strtolower(Slug::generate(
56+
$this->getHandlers()[0][0] . '-' . $this->getHandlers()[0][1] . '-' . $this->getHandler() . '-' . $this->getHandlers()[0][2]
57+
));
5658
}
5759
}

src/Middleware.php

+39-9
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44

55
use InvalidArgumentException;
66

7-
8-
class Middleware
7+
class Middleware
98
{
109
const BEFORE = 'before';
1110
const AFTER = 'after';
@@ -16,37 +15,68 @@ class Middleware
1615
protected $parameters = [];
1716
protected $event = self::BEFORE;
1817

18+
/**
19+
* Construct.
20+
*
21+
* @param string $middlewareKey
22+
*/
1923
public function __construct(string $middlewareKey)
2024
{
21-
$this->middlewareKey = $middlewareKey;
25+
$this->middlewareKey = $middlewareKey;
2226
}
2327

24-
public function event(string $event): void
28+
/**
29+
* Middleware Events.
30+
*
31+
* @param string $event
32+
* @return void
33+
*/
34+
public function event(string $event): void
2535
{
26-
if(!in_array($event, static::EVENTS)){
27-
throw new InvalidArgumentException("Only before and after are accepted events.");
36+
if (!in_array($event, static::EVENTS)) {
37+
throw new InvalidArgumentException('Only before and after are accepted events.');
2838
}
2939
$this->event = $event;
3040
}
3141

42+
/**
43+
* Params.
44+
*
45+
* @param array $parameters
46+
* @return void
47+
*/
3248
public function parameters(array $parameters): void
3349
{
3450
$this->parameters = $parameters;
3551
}
3652

53+
/**
54+
* Middleware key.
55+
*
56+
* @return string
57+
*/
3758
public function getMiddlewareKey(): string
3859
{
3960
return $this->middlewareKey;
4061
}
41-
62+
63+
/**
64+
* Get params.
65+
*
66+
* @return array
67+
*/
4268
public function getParameters(): array
4369
{
4470
return $this->parameters;
4571
}
4672

73+
/**
74+
* Get events.
75+
*
76+
* @return string
77+
*/
4778
public function getEvent(): string
4879
{
4980
return $this->event;
5081
}
51-
52-
}
82+
}

src/Middlewares/RouteMiddleware.php

+34-8
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,48 @@ class RouteMiddleware implements MiddlewareInterface
1212
{
1313
protected $helper;
1414

15+
/**
16+
* Construct.
17+
*
18+
* @param Micro $api
19+
* @param array $routeMiddlewares
20+
*/
1521
public function __construct(Micro $api, array $routeMiddlewares)
1622
{
1723
$this->helper = new RouteMiddlewareHelper($api, $routeMiddlewares);
1824
}
1925

26+
/**
27+
* Before execute route.
28+
*
29+
* @param mixed $event
30+
* @param mixed $api
31+
* @param mixed $contex
32+
* @return bool
33+
*/
2034
public function beforeExecuteRoute($event, $api, $contex)
2135
{
2236
foreach ($this->helper->getRouteMiddlewares(Middleware::BEFORE) as $middleware) {
23-
if(!$this->executeMiddleware($middleware, $api)){
37+
if (!$this->executeMiddleware($middleware, $api)) {
2438
return false;
2539
};
2640
}
2741

28-
return true;
29-
42+
return true;
3043
}
3144

45+
/**
46+
* After executing route.
47+
*
48+
* @param mixed $event
49+
* @param mixed $api
50+
* @param mixed $contex
51+
* @return void
52+
*/
3253
public function afterExecuteRoute($event, $api, $contex)
3354
{
3455
foreach ($this->helper->getRouteMiddlewares(Middleware::AFTER) as $middleware) {
35-
if(!$this->executeMiddleware($middleware, $api)){
56+
if (!$this->executeMiddleware($middleware, $api)) {
3657
return false;
3758
};
3859
}
@@ -41,7 +62,7 @@ public function afterExecuteRoute($event, $api, $contex)
4162
}
4263

4364
/**
44-
* Call me
65+
* Call me.
4566
*
4667
* @param Micro $api
4768
*
@@ -52,7 +73,13 @@ public function call(Micro $api)
5273
return true;
5374
}
5475

55-
76+
/**
77+
* Execute the middleware.
78+
*
79+
* @param Middleware $middleware
80+
* @param Micro $api
81+
* @return void
82+
*/
5683
protected function executeMiddleware(Middleware $middleware, Micro $api)
5784
{
5885
$middlewareClass = $this->helper->getClass(
@@ -61,10 +88,9 @@ protected function executeMiddleware(Middleware $middleware, Micro $api)
6188

6289
$middlewareInstance = new $middlewareClass();
6390

64-
return $middlewareInstance->call(
91+
return $middlewareInstance->call(
6592
$api,
6693
...$middleware->getParameters()
6794
);
6895
}
69-
7096
}

src/Middlewares/RouteMiddlewareHelper.php

+42-17
Original file line numberDiff line numberDiff line change
@@ -8,62 +8,87 @@
88
use Phalcon\Utils\Slug;
99
use Baka\Router\Middleware;
1010

11-
1211
class RouteMiddlewareHelper
1312
{
14-
1513
protected $api;
1614
protected $routeMiddlewares;
1715

16+
/**
17+
* Constructore.
18+
*
19+
* @param Micro $api
20+
* @param array $routeMiddlewares
21+
*/
1822
public function __construct(Micro $api, array $routeMiddlewares)
1923
{
2024
$this->api = $api;
2125
$this->routeMiddlewares = $routeMiddlewares;
22-
2326
}
2427

28+
/**
29+
* Get the current middleware for the given route.
30+
*
31+
* @param string $event
32+
* @return array
33+
*/
2534
public function getRouteMiddlewares(string $event = null) : array
2635
{
27-
$routeIfentifier = $this->getRouteIdentifier($this->api);
36+
$routeIfentifier = $this->getRouteIdentifier($this->api);
2837

2938
$middlewares = $this->api->getSharedService('routeMiddlewares')[$routeIfentifier] ?? [];
3039

31-
return array_filter($middlewares, function(Middleware $middleware) use ($event){
32-
40+
return array_filter($middlewares, function (Middleware $middleware) use ($event) {
3341
$foundRouteMiddleware = $this->isInRouteMiddlewares(
3442
$middleware->getMiddlewareKey()
3543
);
3644

37-
if($event){
38-
return $foundRouteMiddleware and $event === $middleware->getEvent();
45+
if ($event) {
46+
return $foundRouteMiddleware && $event === $middleware->getEvent();
3947
}
4048

4149
return $foundRouteMiddleware;
42-
4350
});
44-
4551
}
4652

47-
public function getRouteIdentifier(): string
53+
/**
54+
* Get the route identifiers.
55+
*
56+
* @return string
57+
*/
58+
public function getRouteIdentifier(): string
4859
{
4960
$activeHanlder = $this->api->getActiveHandler();
5061

51-
return Slug::generate(
52-
($activeHanlder[0])->getDefinition().'-'.$activeHanlder[1]
53-
);
62+
//post, get, put, patch? what methos is this route
63+
$routeMethod = $this->api->di->get('router')->getMatchedRoute()->getHttpMethods();
64+
$routePattern = $this->api->di->get('router')->getMatchedRoute()->getPattern();
65+
66+
return strtolower(Slug::generate(
67+
$routeMethod . '-' . $routePattern . '-' . ($activeHanlder[0])->getDefinition() . '-' . $activeHanlder[1]
68+
));
5469
}
5570

71+
/**
72+
* Get the middleware class.
73+
*
74+
* @param Middleware $middleware
75+
* @return string
76+
*/
5677
public function getClass(Middleware $middleware): string
5778
{
5879
$key = $middleware->getMiddlewareKey();
5980

6081
return $this->routeMiddlewares[$key];
61-
6282
}
6383

84+
/**
85+
* Is the route on this middleware?
86+
*
87+
* @param string $key
88+
* @return boolean
89+
*/
6490
protected function isInRouteMiddlewares(string $key) : bool
6591
{
66-
return isset($this->routeMiddlewares[$key]);
92+
return isset($this->routeMiddlewares[$key]);
6793
}
68-
6994
}

0 commit comments

Comments
 (0)