99
1010namespace Zend \Mvc ;
1111
12+ use Interop \Container \ContainerInterface ;
1213use Psr \Http \Message \ResponseInterface as PsrResponseInterface ;
14+ use Psr \Http \Message \ResponseInterface ;
1315use Psr \Http \Message \ServerRequestInterface as PsrServerRequestInterface ;
1416use Zend \EventManager \AbstractListenerAggregate ;
1517use Zend \EventManager \EventManagerInterface ;
18+ use Zend \Mvc \Exception \MiddlewareNotCallableException ;
1619use Zend \Mvc \Exception \ReachedFinalHandlerException ;
1720use Zend \Psr7Bridge \Psr7ServerRequest as Psr7Request ;
1821use Zend \Psr7Bridge \Psr7Response ;
@@ -52,31 +55,22 @@ public function onDispatch(MvcEvent $event)
5255 $ serviceManager = $ application ->getServiceManager ();
5356
5457 $ 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- }
7858
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 ;
8074 }
8175
8276 $ caughtException = null ;
@@ -103,10 +97,6 @@ function (PsrServerRequestInterface $request, PsrResponseInterface $response) {
10397 if ($ caughtException !== null ) {
10498 $ event ->setName (MvcEvent::EVENT_DISPATCH_ERROR );
10599 $ event ->setError ($ application ::ERROR_EXCEPTION );
106- $ event ->setController ($ middlewareName );
107- if (null !== $ middlewareToBePiped ) {
108- $ event ->setControllerClass (get_class ($ middlewareToBePiped ));
109- }
110100 $ event ->setParam ('exception ' , $ caughtException );
111101
112102 $ events = $ application ->getEventManager ();
@@ -126,6 +116,37 @@ function (PsrServerRequestInterface $request, PsrResponseInterface $response) {
126116 return $ response ;
127117 }
128118
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+
129150 /**
130151 * Marshal a middleware not callable exception event
131152 *
0 commit comments