Skip to content
This repository was archived by the owner on Jan 29, 2020. It is now read-only.

Commit 82e899e

Browse files
committed
Merge pull request #210 from asgrim/add-route-match-params-to-request-attributes
Add route match params to request attributes
2 parents c6d6392 + 05f3e6f commit 82e899e

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

src/MiddlewareListener.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Zend\EventManager\EventManagerInterface;
1515
use Zend\Psr7Bridge\Psr7ServerRequest as Psr7Request;
1616
use Zend\Psr7Bridge\Psr7Response;
17+
use Zend\Router\RouteMatch;
1718

1819
class MiddlewareListener extends AbstractListenerAggregate
1920
{
@@ -59,7 +60,11 @@ public function onDispatch(MvcEvent $event)
5960

6061
$caughtException = null;
6162
try {
62-
$return = $middleware(Psr7Request::fromZend($request), Psr7Response::fromZend($response));
63+
$psr7Request = Psr7Request::fromZend($request)->withAttribute(RouteMatch::class, $routeMatch);
64+
foreach ($routeMatch->getParams() as $key => $value) {
65+
$psr7Request = $psr7Request->withAttribute($key, $value);
66+
}
67+
$return = $middleware($psr7Request, Psr7Response::fromZend($response));
6368
} catch (\Throwable $ex) {
6469
$caughtException = $ex;
6570
} catch (\Exception $ex) { // @TODO clean up once PHP 7 requirement is enforced

test/MiddlewareListenerTest.php

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@
2424

2525
class MiddlewareListenerTest extends TestCase
2626
{
27+
/**
28+
* @var \Prophecy\Prophecy\ObjectProphecy
29+
*/
30+
private $routeMatch;
31+
2732
/**
2833
* Create an MvcEvent, populated with everything it needs.
2934
*
@@ -34,8 +39,9 @@ class MiddlewareListenerTest extends TestCase
3439
public function createMvcEvent($middlewareMatched, $middleware = null)
3540
{
3641
$response = new Response();
37-
$routeMatch = $this->prophesize(RouteMatch::class);
38-
$routeMatch->getParam('middleware', false)->willReturn($middlewareMatched);
42+
$this->routeMatch = $this->prophesize(RouteMatch::class);
43+
$this->routeMatch->getParam('middleware', false)->willReturn($middlewareMatched);
44+
$this->routeMatch->getParams()->willReturn([]);
3945

4046
$eventManager = new EventManager();
4147

@@ -54,7 +60,7 @@ public function createMvcEvent($middlewareMatched, $middleware = null)
5460
$event->setRequest(new Request());
5561
$event->setResponse($response);
5662
$event->setApplication($application->reveal());
57-
$event->setRouteMatch($routeMatch->reveal());
63+
$event->setRouteMatch($this->routeMatch->reveal());
5864

5965
return $event;
6066
}
@@ -82,6 +88,31 @@ public function testSuccessfullyDispatchesMiddleware()
8288
$this->assertEquals('Test!', $return->getBody());
8389
}
8490

91+
public function testMatchedRouteParamsAreInjectedToRequestAsAttributes()
92+
{
93+
$matchedRouteParam = uniqid('matched param', true);
94+
$routeAttribute = null;
95+
96+
$event = $this->createMvcEvent(
97+
'foo',
98+
function (ServerRequestInterface $request, ResponseInterface $response) use (&$routeAttribute) {
99+
$routeAttribute = $request->getAttribute(RouteMatch::class);
100+
$response->getBody()->write($request->getAttribute('myParam', 'param did not exist'));
101+
return $response;
102+
}
103+
);
104+
105+
$this->routeMatch->getParams()->willReturn([
106+
'myParam' => $matchedRouteParam,
107+
]);
108+
109+
$listener = new MiddlewareListener();
110+
$return = $listener->onDispatch($event);
111+
$this->assertInstanceOf(Response::class, $return);
112+
$this->assertSame($matchedRouteParam, $return->getBody());
113+
$this->assertSame($this->routeMatch->reveal(), $routeAttribute);
114+
}
115+
85116
public function testTriggersErrorForUncallableMiddleware()
86117
{
87118
$event = $this->createMvcEvent('path');
@@ -125,6 +156,7 @@ public function testCanLoadFromAbstractFactory()
125156
$response = new Response();
126157
$routeMatch = $this->prophesize(RouteMatch::class);
127158
$routeMatch->getParam('middleware', false)->willReturn('test');
159+
$routeMatch->getParams()->willReturn([]);
128160

129161
$eventManager = new EventManager();
130162

0 commit comments

Comments
 (0)