expects(self::exactly(3))->method('get')->willReturnMap([ [EarlyReturn::class, new EarlyReturn($responseFactory)], [First::class, new First()], [Second::class, new Second()], ]); $handler = new QueueRequestHandler($container, new FallbackHandler($responseFactory)); $handler->add(First::class); $handler->add(EarlyReturn::class); $handler->add(Second::class); $request = ServerRequestFactory::create()->createServerRequest('GET', 'http://example.com/') ->withAttribute('attribute', ['Initial']); $response = $handler->handle($request); $response->getBody()->write('Last'); self::assertSame( 'Initial, First before, Second before, Fallback, Second after, First after, Last', (string) $response->getBody(), ); } public function testQueueWithEarlyReturn(): void { $responseFactory = ResponseFactory::create(); $container = self::createMock(ContainerInterface::class); $container->expects(self::exactly(2))->method('get')->willReturnMap([ [EarlyReturn::class, new EarlyReturn($responseFactory)], [First::class, new First()], ]); $handler = new QueueRequestHandler($container, new FallbackHandler($responseFactory)); $handler->add(First::class); $handler->add(EarlyReturn::class); $handler->add(Second::class); $request = ServerRequestFactory::create()->createServerRequest('GET', 'http://example.com/') ->withAttribute('attribute', ['Initial']) ->withAttribute('early', true); $response = $handler->handle($request); $response->getBody()->write('Last'); self::assertSame('Initial, First before, Early, First after, Last', (string) $response->getBody()); } }