@@ -109,14 +109,13 @@ public function handleAsync(
109
109
110
110
$ request ->headers ->set ('X-Php-Ob-Level ' , ob_get_level ());
111
111
112
- return $ this ->handleAsyncRaw (
113
- $ request ,
114
- $ type
115
- )
116
- ->then (
117
- function (Response $ response ) {
118
- return $ response ;
119
- }, function (\Exception $ e ) use ($ request , $ type , $ catch ) {
112
+ return
113
+ $ this ->handleAsyncRaw (
114
+ $ request ,
115
+ $ type
116
+ )
117
+ ->then (null ,
118
+ function (\Exception $ e ) use ($ request , $ type , $ catch ) {
120
119
if ($ e instanceof RequestExceptionInterface) {
121
120
$ e = new BadRequestHttpException ($ e ->getMessage (), $ e );
122
121
}
@@ -128,7 +127,8 @@ function (Response $response) {
128
127
}
129
128
130
129
return $ this ->handleExceptionPromise ($ e , $ request , $ type );
131
- });
130
+ }
131
+ );
132
132
}
133
133
134
134
/**
@@ -167,40 +167,59 @@ private function handleAsyncRaw(
167
167
->asyncDispatch (AsyncKernelEvents::ASYNC_REQUEST , $ event )
168
168
->then (function (PromiseEvent $ event ) use ($ request , $ type ) {
169
169
if ($ event ->hasPromise ()) {
170
- return $ this ->filterResponsePromise (
171
- $ event ->getPromise (),
172
- $ request ,
173
- $ type
174
- );
170
+ return $ event
171
+ ->getPromise ()
172
+ ->then (function ($ response ) use ($ request , $ type ) {
173
+ return $ response instanceof Response
174
+ ? $ this ->filterResponsePromise (
175
+ new FulfilledPromise ($ response ),
176
+ $ request ,
177
+ $ type
178
+ )
179
+ : $ this ->callAsyncController ($ request , $ type );
180
+ });
175
181
}
176
182
177
- if (false === $ controller = $ this ->resolver ->getController ($ request )) {
178
- throw new NotFoundHttpException (
179
- sprintf ('Unable to find the controller for path "%s". The route is wrongly configured. ' , $ request ->getPathInfo ())
180
- );
181
- }
183
+ return $ this ->callAsyncController ($ request , $ type );
184
+ });
185
+ }
186
+
187
+ /**
188
+ * Call async controller.
189
+ *
190
+ * @param Request $request
191
+ * @param int $type
192
+ *
193
+ * @return PromiseInterface
194
+ */
195
+ private function callAsyncController (Request $ request , int $ type ): PromiseInterface
196
+ {
197
+ if (false === $ controller = $ this ->resolver ->getController ($ request )) {
198
+ throw new NotFoundHttpException (
199
+ sprintf ('Unable to find the controller for path "%s". The route is wrongly configured. ' , $ request ->getPathInfo ())
200
+ );
201
+ }
182
202
183
- $ event = new FilterControllerEvent ($ this , $ controller , $ request , $ type );
184
- $ this ->dispatcher ->dispatch (KernelEvents::CONTROLLER , $ event );
185
- $ controller = $ event ->getController ();
203
+ $ event = new FilterControllerEvent ($ this , $ controller , $ request , $ type );
204
+ $ this ->dispatcher ->dispatch (KernelEvents::CONTROLLER , $ event );
205
+ $ controller = $ event ->getController ();
186
206
187
- // controller arguments
188
- $ arguments = $ this ->argumentResolver ->getArguments ($ request , $ controller );
207
+ // controller arguments
208
+ $ arguments = $ this ->argumentResolver ->getArguments ($ request , $ controller );
189
209
190
- $ event = new FilterControllerArgumentsEvent ($ this , $ controller , $ arguments , $ request , $ type );
191
- $ this ->dispatcher ->dispatch (KernelEvents::CONTROLLER_ARGUMENTS , $ event );
192
- $ controller = $ event ->getController ();
193
- $ arguments = $ event ->getArguments ();
210
+ $ event = new FilterControllerArgumentsEvent ($ this , $ controller , $ arguments , $ request , $ type );
211
+ $ this ->dispatcher ->dispatch (KernelEvents::CONTROLLER_ARGUMENTS , $ event );
212
+ $ controller = $ event ->getController ();
213
+ $ arguments = $ event ->getArguments ();
194
214
195
- /**
196
- * Call controller.
197
- *
198
- * @var PromiseInterface
199
- */
200
- $ promise = $ controller (...$ arguments );
215
+ /**
216
+ * Call controller.
217
+ *
218
+ * @var PromiseInterface
219
+ */
220
+ $ promise = $ controller (...$ arguments );
201
221
202
- return $ this ->filterResponsePromise ($ promise , $ request , $ type );
203
- });
222
+ return $ this ->filterResponsePromise ($ promise , $ request , $ type );
204
223
}
205
224
206
225
/**
@@ -221,12 +240,12 @@ private function filterResponsePromise(PromiseInterface $promise, Request $reque
221
240
return $ this
222
241
->dispatcher
223
242
->asyncDispatch (AsyncKernelEvents::ASYNC_RESPONSE , $ event )
224
- ->then (function (PromiseEvent $ event ) use ($ request , $ type ) {
243
+ ->then (function (PromiseEvent $ event ) use ($ request , $ type, $ promise ) {
225
244
$ this ->finishRequestPromise ($ request , $ type );
226
245
227
246
return $ event ->hasPromise ()
228
247
? $ event ->getPromise ()
229
- : new FulfilledPromise () ;
248
+ : $ promise ;
230
249
});
231
250
}
232
251
0 commit comments