From 8674ba3e0d28c06b2ca441cf4af30bb90f6b0ee7 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 10 Aug 2019 21:30:47 +0200 Subject: [PATCH] #2778 Configure the application via a container --- Slim/Factory/AppFactory.php | 22 +++++++++++++++++++ tests/Factory/AppFactoryTest.php | 37 ++++++++++++++++++++++++++++++++ tests/Mocks/MockContainer.php | 26 ++++++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 tests/Mocks/MockContainer.php diff --git a/Slim/Factory/AppFactory.php b/Slim/Factory/AppFactory.php index 54b0864d9..9d3c10979 100644 --- a/Slim/Factory/AppFactory.php +++ b/Slim/Factory/AppFactory.php @@ -89,6 +89,28 @@ public static function create( ); } + /** + * @param ContainerInterface $container + * @return App + */ + public static function createFromContainer(ContainerInterface $container): App + { + $responseFactory = $container->has(ResponseFactoryInterface::class) + ? $container->get(ResponseFactoryInterface::class) + : self::determineResponseFactory(); + $callableResolver = $container->has(CallableResolverInterface::class) + ? $container->get(CallableResolverInterface::class) + : null; + $routeCollector = $container->has(RouteCollectorInterface::class) + ? $container->get(RouteCollectorInterface::class) + : null; + $routeResolver = $container->has(RouteResolverInterface::class) + ? $container->get(RouteResolverInterface::class) + : null; + + return new App($responseFactory, $container, $callableResolver, $routeCollector, $routeResolver); + } + /** * @return ResponseFactoryInterface * @throws RuntimeException diff --git a/tests/Factory/AppFactoryTest.php b/tests/Factory/AppFactoryTest.php index 83ed1ebb2..423f373ba 100644 --- a/tests/Factory/AppFactoryTest.php +++ b/tests/Factory/AppFactoryTest.php @@ -31,6 +31,7 @@ use Slim\Interfaces\RouteResolverInterface; use Slim\Psr7\Factory\ResponseFactory as SlimResponseFactory; use Slim\Routing\RouteCollector; +use Slim\Tests\Mocks\MockContainer; use Slim\Tests\Mocks\MockPsr17FactoryWithoutStreamFactory; use Slim\Tests\TestCase; use Zend\Diactoros\ResponseFactory as ZendDiactorosResponseFactory; @@ -228,4 +229,40 @@ public function testResponseAndStreamFactoryIsBeingInjectedInDecoratedResponseFa $this->assertSame($streamFactoryProphecy->reveal(), $streamFactoryProperty->getValue($response)); } + + public function testCreateAppWithEmptyContainer() + { + $container = new MockContainer([]); + + $app = AppFactory::createFromContainer($container); + + $this->assertSame($container, $app->getContainer()); + } + + public function testCreateAppWithContainerThatProvidesAllImplementations() + { + $responseFactory = $this->createMock(ResponseFactoryInterface::class); + $callableResolver = $this->createMock(CallableResolverInterface::class); + $routeParser = $this->createMock(RouteParserInterface::class); + $routeCollector = $this->createConfiguredMock(RouteCollectorInterface::class, [ + 'getRouteParser' => $routeParser + ]); + $routeResolver = $this->createMock(RouteResolverInterface::class); + + $container = new MockContainer([ + ResponseFactoryInterface::class => $responseFactory, + CallableResolverInterface::class => $callableResolver, + RouteCollectorInterface::class => $routeCollector, + RouteParserInterface::class => $routeParser, + RouteResolverInterface::class => $routeResolver, + ]); + + $app = AppFactory::createFromContainer($container); + + $this->assertSame($responseFactory, $app->getResponseFactory()); + $this->assertSame($container, $app->getContainer()); + $this->assertSame($callableResolver, $app->getCallableResolver()); + $this->assertSame($routeCollector, $app->getRouteCollector()); + $this->assertSame($routeResolver, $app->getRouteResolver()); + } } diff --git a/tests/Mocks/MockContainer.php b/tests/Mocks/MockContainer.php new file mode 100644 index 000000000..459378818 --- /dev/null +++ b/tests/Mocks/MockContainer.php @@ -0,0 +1,26 @@ +entries = $entries; + } + + public function get($id) + { + return $this->entries[$id]; + } + + public function has($id) + { + return array_key_exists($id, $this->entries); + } +}