1010namespace Zend \Mvc ;
1111
1212use Psr \Http \Message \ResponseInterface as PsrResponseInterface ;
13+ use Psr \Http \Message \ServerRequestInterface as PsrServerRequestInterface ;
1314use Zend \EventManager \AbstractListenerAggregate ;
1415use Zend \EventManager \EventManagerInterface ;
16+ use Zend \Mvc \Exception \ReachedFinalHandlerException ;
1517use Zend \Psr7Bridge \Psr7ServerRequest as Psr7Request ;
1618use Zend \Psr7Bridge \Psr7Response ;
1719use Zend \Router \RouteMatch ;
20+ use Zend \Stratigility \MiddlewarePipe ;
1821
1922class 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