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

Commit 0e0a650

Browse files
committed
Added implementation of Stratigility middleware pipe
1 parent 3306eb8 commit 0e0a650

File tree

1 file changed

+36
-10
lines changed

1 file changed

+36
-10
lines changed

src/MiddlewareListener.php

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@
1010
namespace Zend\Mvc;
1111

1212
use Psr\Http\Message\ResponseInterface as PsrResponseInterface;
13+
use Psr\Http\Message\ServerRequestInterface as PsrServerRequestInterface;
1314
use Zend\EventManager\AbstractListenerAggregate;
1415
use Zend\EventManager\EventManagerInterface;
16+
use Zend\Mvc\Exception\ReachedFinalHandlerException;
1517
use Zend\Psr7Bridge\Psr7ServerRequest as Psr7Request;
1618
use Zend\Psr7Bridge\Psr7Response;
19+
use Zend\Stratigility\MiddlewarePipe;
1720

1821
class MiddlewareListener extends AbstractListenerAggregate
1922
{
@@ -46,20 +49,41 @@ public function onDispatch(MvcEvent $event)
4649
$application = $event->getApplication();
4750
$response = $application->getResponse();
4851
$serviceManager = $application->getServiceManager();
49-
$middlewareName = is_string($middleware) ? $middleware : get_class($middleware);
5052

51-
if (is_string($middleware) && $serviceManager->has($middleware)) {
52-
$middleware = $serviceManager->get($middleware);
53-
}
54-
if (! is_callable($middleware)) {
55-
$return = $this->marshalMiddlewareNotCallable($application::ERROR_MIDDLEWARE_CANNOT_DISPATCH, $middlewareName, $event, $application);
56-
$event->setResult($return);
57-
return $return;
53+
$psr7ResponsePrototype = Psr7Response::fromZend($response);
54+
$pipe = new MiddlewarePipe();
55+
$pipe->setResponsePrototype($psr7ResponsePrototype);
56+
57+
$middlewaresToBePiped = !is_array($middleware) ? [$middleware] : $middleware;
58+
59+
$middlewareName = 'noMiddlewarePiped';
60+
$middlewareToBePiped = null;
61+
foreach ($middlewaresToBePiped as $middlewareToBePiped) {
62+
$middlewareName = is_string($middlewareToBePiped) ? $middlewareToBePiped : get_class($middlewareToBePiped);
63+
64+
if (is_string($middlewareToBePiped) && $serviceManager->has($middlewareToBePiped)) {
65+
$middlewareToBePiped = $serviceManager->get($middlewareToBePiped);
66+
}
67+
if (! is_callable($middlewareToBePiped)) {
68+
$return = $this->marshalMiddlewareNotCallable($application::ERROR_MIDDLEWARE_CANNOT_DISPATCH, $middlewareName, $event, $application);
69+
$event->setResult($return);
70+
return $return;
71+
}
72+
73+
$pipe->pipe($middlewareToBePiped);
5874
}
5975

6076
$caughtException = null;
6177
try {
62-
$return = $middleware(Psr7Request::fromZend($request), Psr7Response::fromZend($response));
78+
$return = $pipe(
79+
Psr7Request::fromZend($request),
80+
$psr7ResponsePrototype,
81+
function (PsrServerRequestInterface $request, PsrResponseInterface $response) {
82+
throw new ReachedFinalHandlerException(
83+
'Reached the final handler for middleware pipe - check the pipe configuration'
84+
);
85+
}
86+
);
6387
} catch (\Throwable $ex) {
6488
$caughtException = $ex;
6589
} catch (\Exception $ex) { // @TODO clean up once PHP 7 requirement is enforced
@@ -70,7 +94,9 @@ public function onDispatch(MvcEvent $event)
7094
$event->setName(MvcEvent::EVENT_DISPATCH_ERROR);
7195
$event->setError($application::ERROR_EXCEPTION);
7296
$event->setController($middlewareName);
73-
$event->setControllerClass(get_class($middleware));
97+
if (null !== $middlewareToBePiped) {
98+
$event->setControllerClass(get_class($middlewareToBePiped));
99+
}
74100
$event->setParam('exception', $caughtException);
75101

76102
$events = $application->getEventManager();

0 commit comments

Comments
 (0)