@@ -204,6 +204,54 @@ public function test_http_kernel_handle_subrequest(): void
204204 $ this ->assertSame (SpanKind::KIND_INTERNAL , $ span ->getKind ());
205205 }
206206
207+ public function test_http_kernel_handle_subrequest_with_various_controller_types (): void
208+ {
209+ $ kernel = $ this ->getHttpKernel (new EventDispatcher ());
210+
211+ // String controller
212+ $ request = new Request ();
213+ $ request ->attributes ->set ('_controller ' , 'SomeController::index ' );
214+ $ kernel ->handle ($ request , \Symfony \Component \HttpKernel \HttpKernelInterface::SUB_REQUEST );
215+ $ this ->assertSame ('GET SomeController::index ' , $ this ->storage [0 ]->getName ());
216+ $ this ->storage ->exchangeArray ([]);
217+
218+ // Array: [object, method]
219+ $ controllerObj = new class () {};
220+ $ request = new Request ();
221+ $ request ->attributes ->set ('_controller ' , [$ controllerObj , 'fooAction ' ]);
222+ $ kernel ->handle ($ request , \Symfony \Component \HttpKernel \HttpKernelInterface::SUB_REQUEST );
223+ $ this ->assertSame ('GET ' . get_class ($ controllerObj ) . '::fooAction ' , $ this ->storage [0 ]->getName ());
224+ $ this ->storage ->exchangeArray ([]);
225+
226+ // Array: [class, method]
227+ $ request = new Request ();
228+ $ request ->attributes ->set ('_controller ' , ['SomeClass ' , 'barAction ' ]);
229+ $ kernel ->handle ($ request , \Symfony \Component \HttpKernel \HttpKernelInterface::SUB_REQUEST );
230+ $ this ->assertSame ('GET SomeClass::barAction ' , $ this ->storage [0 ]->getName ());
231+ $ this ->storage ->exchangeArray ([]);
232+ }
233+
234+ /**
235+ * @psalm-suppress UnevaluatedCode
236+ */
237+ public function test_http_kernel_handle_subrequest_with_null_and_object_controller (): void
238+ {
239+ $ kernel = $ this ->getHttpKernel (new EventDispatcher ());
240+
241+ // Object controller (should fallback to 'sub-request')
242+ $ controllerObj2 = new class () {};
243+ $ request = new Request ();
244+ $ request ->attributes ->set ('_controller ' , $ controllerObj2 );
245+ $ kernel ->handle ($ request , \Symfony \Component \HttpKernel \HttpKernelInterface::SUB_REQUEST );
246+ $ this ->assertSame ('GET sub-request ' , $ this ->storage [0 ]->getName ());
247+
248+ // Null/other controller (should fallback to 'sub-request')
249+ $ request = new Request ();
250+ $ request ->attributes ->set ('_controller ' , null );
251+ $ kernel ->handle ($ request , \Symfony \Component \HttpKernel \HttpKernelInterface::SUB_REQUEST );
252+ $ this ->assertSame ('GET sub-request ' , $ this ->storage [0 ]->getName ());
253+ }
254+
207255 private function getHttpKernel (EventDispatcherInterface $ eventDispatcher , $ controller = null , ?RequestStack $ requestStack = null , array $ arguments = []): HttpKernel
208256 {
209257 $ controller ??= fn () => new Response ('Hello ' );
0 commit comments