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 ;
19
+ use Zend \Stratigility \MiddlewarePipe ;
17
20
18
21
class MiddlewareListener extends AbstractListenerAggregate
19
22
{
@@ -46,20 +49,41 @@ public function onDispatch(MvcEvent $event)
46
49
$ application = $ event ->getApplication ();
47
50
$ response = $ application ->getResponse ();
48
51
$ serviceManager = $ application ->getServiceManager ();
49
- $ middlewareName = is_string ($ middleware ) ? $ middleware : get_class ($ middleware );
50
52
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 );
58
74
}
59
75
60
76
$ caughtException = null ;
61
77
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
+ );
63
87
} catch (\Throwable $ ex ) {
64
88
$ caughtException = $ ex ;
65
89
} catch (\Exception $ ex ) { // @TODO clean up once PHP 7 requirement is enforced
@@ -70,7 +94,9 @@ public function onDispatch(MvcEvent $event)
70
94
$ event ->setName (MvcEvent::EVENT_DISPATCH_ERROR );
71
95
$ event ->setError ($ application ::ERROR_EXCEPTION );
72
96
$ event ->setController ($ middlewareName );
73
- $ event ->setControllerClass (get_class ($ middleware ));
97
+ if (null !== $ middlewareToBePiped ) {
98
+ $ event ->setControllerClass (get_class ($ middlewareToBePiped ));
99
+ }
74
100
$ event ->setParam ('exception ' , $ caughtException );
75
101
76
102
$ events = $ application ->getEventManager ();
0 commit comments