9
9
10
10
namespace Zend \Mvc ;
11
11
12
+ use Interop \Container \ContainerInterface ;
12
13
use Psr \Http \Message \ResponseInterface as PsrResponseInterface ;
14
+ use Psr \Http \Message \ResponseInterface ;
13
15
use Psr \Http \Message \ServerRequestInterface as PsrServerRequestInterface ;
14
16
use Zend \EventManager \AbstractListenerAggregate ;
15
17
use Zend \EventManager \EventManagerInterface ;
18
+ use Zend \Mvc \Exception \MiddlewareNotCallableException ;
16
19
use Zend \Mvc \Exception \ReachedFinalHandlerException ;
17
20
use Zend \Psr7Bridge \Psr7ServerRequest as Psr7Request ;
18
21
use Zend \Psr7Bridge \Psr7Response ;
@@ -52,31 +55,22 @@ public function onDispatch(MvcEvent $event)
52
55
$ serviceManager = $ application ->getServiceManager ();
53
56
54
57
$ 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
58
79
- $ pipe ->pipe ($ middlewareToBePiped );
59
+ try {
60
+ $ pipe = $ this ->createPipeFromSpec (
61
+ $ serviceManager ,
62
+ $ psr7ResponsePrototype ,
63
+ is_array ($ middleware ) ? $ middleware : [$ middleware ]
64
+ );
65
+ } catch (MiddlewareNotCallableException $ middlewareNotCallableException ) {
66
+ $ return = $ this ->marshalMiddlewareNotCallable (
67
+ $ application ::ERROR_MIDDLEWARE_CANNOT_DISPATCH ,
68
+ $ middlewareNotCallableException ->toMiddlewareName (),
69
+ $ event ,
70
+ $ application
71
+ );
72
+ $ event ->setResult ($ return );
73
+ return $ return ;
80
74
}
81
75
82
76
$ caughtException = null ;
@@ -103,10 +97,6 @@ function (PsrServerRequestInterface $request, PsrResponseInterface $response) {
103
97
if ($ caughtException !== null ) {
104
98
$ event ->setName (MvcEvent::EVENT_DISPATCH_ERROR );
105
99
$ event ->setError ($ application ::ERROR_EXCEPTION );
106
- $ event ->setController ($ middlewareName );
107
- if (null !== $ middlewareToBePiped ) {
108
- $ event ->setControllerClass (get_class ($ middlewareToBePiped ));
109
- }
110
100
$ event ->setParam ('exception ' , $ caughtException );
111
101
112
102
$ events = $ application ->getEventManager ();
@@ -126,6 +116,37 @@ function (PsrServerRequestInterface $request, PsrResponseInterface $response) {
126
116
return $ response ;
127
117
}
128
118
119
+ /**
120
+ * Create a middleware pipe from the array spec given.
121
+ *
122
+ * @param ContainerInterface $serviceLocator
123
+ * @param ResponseInterface $responsePrototype
124
+ * @param array $middlewaresToBePiped
125
+ * @return MiddlewarePipe
126
+ * @throws \Zend\Mvc\Exception\MiddlewareNotCallableException
127
+ */
128
+ private function createPipeFromSpec (
129
+ ContainerInterface $ serviceLocator ,
130
+ ResponseInterface $ responsePrototype ,
131
+ array $ middlewaresToBePiped
132
+ ) {
133
+ $ pipe = new MiddlewarePipe ();
134
+ $ pipe ->setResponsePrototype ($ responsePrototype );
135
+ foreach ($ middlewaresToBePiped as $ middlewareToBePiped ) {
136
+ $ middlewareName = is_string ($ middlewareToBePiped ) ? $ middlewareToBePiped : get_class ($ middlewareToBePiped );
137
+
138
+ if (is_string ($ middlewareToBePiped ) && $ serviceLocator ->has ($ middlewareToBePiped )) {
139
+ $ middlewareToBePiped = $ serviceLocator ->get ($ middlewareToBePiped );
140
+ }
141
+ if (! is_callable ($ middlewareToBePiped )) {
142
+ throw MiddlewareNotCallableException::fromMiddlewareName ($ middlewareName );
143
+ }
144
+
145
+ $ pipe ->pipe ($ middlewareToBePiped );
146
+ }
147
+ return $ pipe ;
148
+ }
149
+
129
150
/**
130
151
* Marshal a middleware not callable exception event
131
152
*
0 commit comments