10
10
namespace Zend \Mvc ;
11
11
12
12
use Psr \Http \Message \ResponseInterface as PsrResponseInterface ;
13
+ use Psr \Http \Message \ServerRequestInterface as PsrServerRequestInterface ;
13
14
use Zend \EventManager \AbstractListenerAggregate ;
14
15
use Zend \EventManager \EventManagerInterface ;
16
+ use Zend \Mvc \Exception \ReachedFinalHandlerException ;
15
17
use Zend \Psr7Bridge \Psr7ServerRequest as Psr7Request ;
16
18
use Zend \Psr7Bridge \Psr7Response ;
17
19
use Zend \Router \RouteMatch ;
20
+ use Zend \Stratigility \MiddlewarePipe ;
18
21
19
22
class MiddlewareListener extends AbstractListenerAggregate
20
23
{
@@ -47,20 +50,33 @@ public function onDispatch(MvcEvent $event)
47
50
$ application = $ event ->getApplication ();
48
51
$ response = $ application ->getResponse ();
49
52
$ serviceManager = $ application ->getServiceManager ();
50
- $ middlewareName = is_string ($ middleware ) ? $ middleware : get_class ($ middleware );
51
53
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 );
64
80
}
65
81
66
82
$ caughtException = null ;
@@ -69,7 +85,15 @@ public function onDispatch(MvcEvent $event)
69
85
foreach ($ routeMatch ->getParams () as $ key => $ value ) {
70
86
$ psr7Request = $ psr7Request ->withAttribute ($ key , $ value );
71
87
}
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
+ );
73
97
} catch (\Throwable $ ex ) {
74
98
$ caughtException = $ ex ;
75
99
} catch (\Exception $ ex ) { // @TODO clean up once PHP 7 requirement is enforced
@@ -80,7 +104,9 @@ public function onDispatch(MvcEvent $event)
80
104
$ event ->setName (MvcEvent::EVENT_DISPATCH_ERROR );
81
105
$ event ->setError ($ application ::ERROR_EXCEPTION );
82
106
$ event ->setController ($ middlewareName );
83
- $ event ->setControllerClass (get_class ($ middleware ));
107
+ if (null !== $ middlewareToBePiped ) {
108
+ $ event ->setControllerClass (get_class ($ middlewareToBePiped ));
109
+ }
84
110
$ event ->setParam ('exception ' , $ caughtException );
85
111
86
112
$ events = $ application ->getEventManager ();
0 commit comments