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

Commit fe65cba

Browse files
committed
Added a first middleware support
1 parent 6775182 commit fe65cba

File tree

4 files changed

+68
-8
lines changed

4 files changed

+68
-8
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
"zendframework/zend-servicemanager": "~2.5",
1919
"zendframework/zend-hydrator": "~1.0",
2020
"zendframework/zend-form": "~2.6",
21-
"zendframework/zend-stdlib": "~2.7"
21+
"zendframework/zend-stdlib": "~2.7",
22+
"zendframework/zend-psr7bridge": "^0.2"
2223
},
2324
"require-dev": {
2425
"zendframework/zend-authentication": "~2.5",

src/Application.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ class Application implements
5252
const ERROR_CONTROLLER_INVALID = 'error-controller-invalid';
5353
const ERROR_EXCEPTION = 'error-exception';
5454
const ERROR_ROUTER_NO_MATCH = 'error-router-no-match';
55-
55+
const ERROR_MIDDLEWARE_CANNOT_DISPATCH = 'error-middleware-cannot-dispatch';
56+
5657
/**
5758
* @var array
5859
*/

src/DispatchListener.php

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
use Zend\EventManager\EventManagerInterface;
1515
use Zend\Mvc\Exception\InvalidControllerException;
1616
use Zend\Stdlib\ArrayUtils;
17+
use Zend\Psr7Bridge\Psr7ServerRequest as Psr7Request;
18+
use Zend\Psr7Bridge\Psr7Response;
1719

1820
/**
1921
* Default dispatch listener
@@ -61,11 +63,30 @@ public function attach(EventManagerInterface $events)
6163
*/
6264
public function onDispatch(MvcEvent $e)
6365
{
64-
$routeMatch = $e->getRouteMatch();
66+
$routeMatch = $e->getRouteMatch();
67+
$request = $e->getRequest();
68+
$application = $e->getApplication();
69+
$response = $application->getResponse();
70+
$serviceManager = $application->getServiceManager();
71+
72+
// middleware?
73+
$middleware = $routeMatch->getParam('middleware', false);
74+
if (false !== $middleware) {
75+
if (is_string($middleware) && $serviceManager->has($middleware)) {
76+
$middleware = $serviceManager->get($middleware);
77+
}
78+
if (!is_callable($middleware)) {
79+
$middleware = is_string($middleware) ? $middleware : get_class($middleware);
80+
$return = $this->marshalControllerNotFoundEvent($application::ERROR_MIDDLEWARE_CANNOT_DISPATCH, $middleware, $e, $application);
81+
return $this->complete($return, $e);
82+
}
83+
$return = $middleware(Psr7Request::fromZend($request), Psr7Response::fromZend($response));
84+
return $this->complete(Psr7Response::toZend($return), $e);
85+
}
86+
6587
$controllerName = $routeMatch->getParam('controller', 'not-found');
66-
$application = $e->getApplication();
6788
$events = $application->getEventManager();
68-
$controllerLoader = $application->getServiceManager()->get('ControllerManager');
89+
$controllerLoader = $serviceManager->get('ControllerManager');
6990

7091
if (!$controllerLoader->has($controllerName)) {
7192
$return = $this->marshalControllerNotFoundEvent($application::ERROR_CONTROLLER_NOT_FOUND, $controllerName, $e, $application);
@@ -82,9 +103,6 @@ public function onDispatch(MvcEvent $e)
82103
return $this->complete($return, $e);
83104
}
84105

85-
$request = $e->getRequest();
86-
$response = $application->getResponse();
87-
88106
if ($controller instanceof InjectApplicationEventInterface) {
89107
$controller->setEvent($e);
90108
}

test/DispatchListenerTest.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,44 @@ public function testUnlocatableControllerLoaderComposedOfAbstractFactory()
122122
$this->assertArrayHasKey('error', $log);
123123
$this->assertSame('error-controller-not-found', $log['error']);
124124
}
125+
126+
public function testMiddlewareDispatch()
127+
{
128+
$request = $this->serviceManager->get('Request');
129+
$request->setUri('http://example.local/path');
130+
131+
$router = $this->serviceManager->get('HttpRouter');
132+
$route = Router\Http\Literal::factory([
133+
'route' => '/path',
134+
'defaults' => [
135+
'middleware' => function($request, $response) {
136+
$this->assertInstanceOf('Psr\Http\Message\ServerRequestInterface', $request);
137+
$this->assertInstanceOf('Psr\Http\Message\ResponseInterface', $response);
138+
$response->getBody()->write('Test!');
139+
return $response;
140+
}
141+
],
142+
]);
143+
$router->addRoute('path', $route);
144+
$this->application->bootstrap();
145+
146+
$controllerLoader = $this->serviceManager->get('ControllerLoader');
147+
$controllerLoader->addAbstractFactory('ZendTest\Mvc\Controller\TestAsset\ControllerLoaderAbstractFactory');
148+
149+
$log = [];
150+
$this->application->getEventManager()->attach(MvcEvent::EVENT_DISPATCH_ERROR, function ($e) use (&$log) {
151+
$log['error'] = $e->getError();
152+
});
153+
154+
$this->application->run();
155+
156+
$event = $this->application->getMvcEvent();
157+
$dispatchListener = $this->serviceManager->get('DispatchListener');
158+
$return = $dispatchListener->onDispatch($event);
159+
160+
$this->assertEmpty($log);
161+
$this->assertInstanceOf('Zend\Http\Response', $return);
162+
$this->assertSame(200, $return->getStatusCode());
163+
$this->assertEquals('Test!', $return->getBody());
164+
}
125165
}

0 commit comments

Comments
 (0)