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

Commit 24201cb

Browse files
committed
Added implementation of Stratigility middleware pipe
1 parent cab17a2 commit 24201cb

File tree

1 file changed

+41
-15
lines changed

1 file changed

+41
-15
lines changed

src/MiddlewareListener.php

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@
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;
1719
use Zend\Router\RouteMatch;
20+
use Zend\Stratigility\MiddlewarePipe;
1821

1922
class MiddlewareListener extends AbstractListenerAggregate
2023
{
@@ -47,20 +50,33 @@ public function onDispatch(MvcEvent $event)
4750
$application = $event->getApplication();
4851
$response = $application->getResponse();
4952
$serviceManager = $application->getServiceManager();
50-
$middlewareName = is_string($middleware) ? $middleware : get_class($middleware);
5153

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

6682
$caughtException = null;
@@ -69,7 +85,15 @@ public function onDispatch(MvcEvent $event)
6985
foreach ($routeMatch->getParams() as $key => $value) {
7086
$psr7Request = $psr7Request->withAttribute($key, $value);
7187
}
72-
$return = $middleware($psr7Request, Psr7Response::fromZend($response));
88+
$return = $pipe(
89+
$psr7Request,
90+
$psr7ResponsePrototype,
91+
function (PsrServerRequestInterface $request, PsrResponseInterface $response) {
92+
throw new ReachedFinalHandlerException(
93+
'Reached the final handler for middleware pipe - check the pipe configuration'
94+
);
95+
}
96+
);
7397
} catch (\Throwable $ex) {
7498
$caughtException = $ex;
7599
} catch (\Exception $ex) { // @TODO clean up once PHP 7 requirement is enforced
@@ -80,7 +104,9 @@ public function onDispatch(MvcEvent $event)
80104
$event->setName(MvcEvent::EVENT_DISPATCH_ERROR);
81105
$event->setError($application::ERROR_EXCEPTION);
82106
$event->setController($middlewareName);
83-
$event->setControllerClass(get_class($middleware));
107+
if (null !== $middlewareToBePiped) {
108+
$event->setControllerClass(get_class($middlewareToBePiped));
109+
}
84110
$event->setParam('exception', $caughtException);
85111

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

0 commit comments

Comments
 (0)