Skip to content
This repository was archived by the owner on Jan 29, 2020. It is now read-only.

Commit 6787c4b

Browse files
committed
Allow ResponseInterface service to return a factory
Per Expressive 2.2; allows the instance returned to be a factory, instead of the response itself.
1 parent 948285c commit 6787c4b

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

src/HalResponseFactoryFactory.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ public function __invoke(ContainerInterface $container) : HalResponseFactory
6262
private function getResponseInstance(ContainerInterface $container) : ResponseInterface
6363
{
6464
if ($container->has(ResponseInterface::class)) {
65-
return $container->get(ResponseInterface::class);
65+
$response = $container->get(ResponseInterface::class);
66+
return is_callable($response) ? $response() : $response;
6667
}
6768

6869
if (class_exists(Response::class)) {

test/HalResponseFactoryFactoryTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,37 @@ public function testReturnsHalResponseFactoryInstanceWithoutConfiguredDependenci
6666
self::assertAttributeInstanceOf(ResponseInterface::class, 'responsePrototype', $instance);
6767
self::assertAttributeInstanceOf(Closure::class, 'streamFactory', $instance);
6868
}
69+
70+
public function testReturnsHalResponseFactoryInstanceWhenResponseInterfaceReturnsFactory()
71+
{
72+
$jsonRenderer = $this->prophesize(Renderer\JsonRenderer::class)->reveal();
73+
$xmlRenderer = $this->prophesize(Renderer\XmlRenderer::class)->reveal();
74+
$response = $this->prophesize(ResponseInterface::class)->reveal();
75+
$responseFactory = function () use ($response) {
76+
return $response;
77+
};
78+
$stream = new class()
79+
{
80+
public function __invoke()
81+
{
82+
}
83+
};
84+
85+
$container = $this->prophesize(ContainerInterface::class);
86+
$container->has(Renderer\JsonRenderer::class)->willReturn(true);
87+
$container->get(Renderer\JsonRenderer::class)->willReturn($jsonRenderer);
88+
$container->has(Renderer\XmlRenderer::class)->willReturn(true);
89+
$container->get(Renderer\XmlRenderer::class)->willReturn($xmlRenderer);
90+
$container->has(ResponseInterface::class)->willReturn(true);
91+
$container->get(ResponseInterface::class)->willReturn($responseFactory);
92+
$container->has(StreamInterface::class)->willReturn(true);
93+
$container->get(StreamInterface::class)->willReturn($stream);
94+
95+
$instance = (new HalResponseFactoryFactory())($container->reveal());
96+
self::assertInstanceOf(HalResponseFactory::class, $instance);
97+
self::assertAttributeSame($jsonRenderer, 'jsonRenderer', $instance);
98+
self::assertAttributeSame($xmlRenderer, 'xmlRenderer', $instance);
99+
self::assertAttributeSame($response, 'responsePrototype', $instance);
100+
self::assertAttributeSame($stream, 'streamFactory', $instance);
101+
}
69102
}

0 commit comments

Comments
 (0)