From 71812699f3b4e1132181669b4bc8918acec64b68 Mon Sep 17 00:00:00 2001 From: Alexis Thinardon Date: Tue, 9 Jan 2018 12:13:03 +0100 Subject: [PATCH] Ability to disable entrypoint and /api/docs --- .../DependencyInjection/ApiPlatformExtension.php | 2 ++ .../Bundle/DependencyInjection/Configuration.php | 2 ++ src/Bridge/Symfony/Bundle/Resources/config/api.xml | 2 ++ .../Bundle/Resources/config/routing/api.xml | 6 ------ .../Bundle/Resources/config/routing/docs.xml | 14 ++++++++++++++ src/Bridge/Symfony/Routing/ApiLoader.php | 14 +++++++++++++- .../ApiPlatformExtensionTest.php | 2 ++ .../DependencyInjection/ConfigurationTest.php | 2 ++ tests/Bridge/Symfony/Routing/ApiLoaderTest.php | 2 +- 9 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 src/Bridge/Symfony/Bundle/Resources/config/routing/docs.xml diff --git a/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php b/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php index 2b0d61fde27..0affa1ffedb 100644 --- a/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php +++ b/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php @@ -143,6 +143,8 @@ public function load(array $configs, ContainerBuilder $container) */ private function handleConfig(ContainerBuilder $container, array $config, array $formats, array $errorFormats) { + $container->setParameter('api_platform.enable_entrypoint', $config['enable_entrypoint']); + $container->setParameter('api_platform.enable_docs', $config['enable_docs']); $container->setParameter('api_platform.title', $config['title']); $container->setParameter('api_platform.description', $config['description']); $container->setParameter('api_platform.version', $config['version']); diff --git a/src/Bridge/Symfony/Bundle/DependencyInjection/Configuration.php b/src/Bridge/Symfony/Bundle/DependencyInjection/Configuration.php index 4881a2a4d62..ae5bad9f34a 100644 --- a/src/Bridge/Symfony/Bundle/DependencyInjection/Configuration.php +++ b/src/Bridge/Symfony/Bundle/DependencyInjection/Configuration.php @@ -99,6 +99,8 @@ public function getConfigTreeBuilder() ->end() ->booleanNode('enable_swagger')->defaultValue(true)->info('Enable the Swagger documentation and export.')->end() ->booleanNode('enable_swagger_ui')->defaultValue(class_exists(TwigBundle::class))->info('Enable Swagger ui.')->end() + ->booleanNode('enable_entrypoint')->defaultTrue()->info('Enable the entrypoint')->end() + ->booleanNode('enable_docs')->defaultTrue()->info('Enable the docs')->end() ->arrayNode('oauth') ->canBeEnabled() diff --git a/src/Bridge/Symfony/Bundle/Resources/config/api.xml b/src/Bridge/Symfony/Bundle/Resources/config/api.xml index acc86ae9436..ee34b703664 100644 --- a/src/Bridge/Symfony/Bundle/Resources/config/api.xml +++ b/src/Bridge/Symfony/Bundle/Resources/config/api.xml @@ -38,6 +38,8 @@ %api_platform.resource_class_directories% %api_platform.graphql.enabled% + %api_platform.enable_entrypoint% + %api_platform.enable_docs% diff --git a/src/Bridge/Symfony/Bundle/Resources/config/routing/api.xml b/src/Bridge/Symfony/Bundle/Resources/config/routing/api.xml index 793562d144c..0a04cf423c8 100644 --- a/src/Bridge/Symfony/Bundle/Resources/config/routing/api.xml +++ b/src/Bridge/Symfony/Bundle/Resources/config/routing/api.xml @@ -13,10 +13,4 @@ index - - api_platform.action.documentation - 1 - - - diff --git a/src/Bridge/Symfony/Bundle/Resources/config/routing/docs.xml b/src/Bridge/Symfony/Bundle/Resources/config/routing/docs.xml new file mode 100644 index 00000000000..ba2c7887fad --- /dev/null +++ b/src/Bridge/Symfony/Bundle/Resources/config/routing/docs.xml @@ -0,0 +1,14 @@ + + + + + + api_platform.action.documentation + 1 + + + + diff --git a/src/Bridge/Symfony/Routing/ApiLoader.php b/src/Bridge/Symfony/Routing/ApiLoader.php index 6c7c465b978..08f57cdafb9 100644 --- a/src/Bridge/Symfony/Routing/ApiLoader.php +++ b/src/Bridge/Symfony/Routing/ApiLoader.php @@ -51,8 +51,10 @@ final class ApiLoader extends Loader private $resourceClassDirectories; private $subresourceOperationFactory; private $graphqlEnabled; + private $entrypointEnabled; + private $docsEnabled; - public function __construct(KernelInterface $kernel, ResourceNameCollectionFactoryInterface $resourceNameCollectionFactory, ResourceMetadataFactoryInterface $resourceMetadataFactory, OperationPathResolverInterface $operationPathResolver, ContainerInterface $container, array $formats, array $resourceClassDirectories = [], SubresourceOperationFactoryInterface $subresourceOperationFactory = null, bool $graphqlEnabled = false) + public function __construct(KernelInterface $kernel, ResourceNameCollectionFactoryInterface $resourceNameCollectionFactory, ResourceMetadataFactoryInterface $resourceMetadataFactory, OperationPathResolverInterface $operationPathResolver, ContainerInterface $container, array $formats, array $resourceClassDirectories = [], SubresourceOperationFactoryInterface $subresourceOperationFactory = null, bool $graphqlEnabled = false, bool $entrypointEnabled = true, bool $docsEnabled = true) { $this->fileLoader = new XmlFileLoader(new FileLocator($kernel->locateResource('@ApiPlatformBundle/Resources/config/routing'))); $this->resourceNameCollectionFactory = $resourceNameCollectionFactory; @@ -63,6 +65,8 @@ public function __construct(KernelInterface $kernel, ResourceNameCollectionFacto $this->resourceClassDirectories = $resourceClassDirectories; $this->subresourceOperationFactory = $subresourceOperationFactory; $this->graphqlEnabled = $graphqlEnabled; + $this->entrypointEnabled = $entrypointEnabled; + $this->docsEnabled = $docsEnabled; } /** @@ -146,6 +150,14 @@ private function loadExternalFiles(RouteCollection $routeCollection) { $routeCollection->addCollection($this->fileLoader->load('api.xml')); + if ($this->entrypointEnabled) { + $routeCollection->addCollection($this->fileLoader->load('api.xml')); + } + + if ($this->docsEnabled) { + $routeCollection->addCollection($this->fileLoader->load('docs.xml')); + } + if ($this->graphqlEnabled) { $graphqlCollection = $this->fileLoader->load('graphql.xml'); $graphqlCollection->addDefaults(['_graphql' => true]); diff --git a/tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php b/tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php index 72b061a0b37..841676ef3c4 100644 --- a/tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php +++ b/tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php @@ -396,6 +396,8 @@ private function getPartialContainerBuilderProphecy($test = false) 'api_platform.http_cache.shared_max_age' => null, 'api_platform.http_cache.vary' => ['Accept'], 'api_platform.http_cache.public' => null, + 'api_platform.enable_entrypoint' => true, + 'api_platform.enable_docs' => true, ]; foreach ($parameters as $key => $value) { diff --git a/tests/Bridge/Symfony/Bundle/DependencyInjection/ConfigurationTest.php b/tests/Bridge/Symfony/Bundle/DependencyInjection/ConfigurationTest.php index 6b330ab1a0e..2a2963aac00 100644 --- a/tests/Bridge/Symfony/Bundle/DependencyInjection/ConfigurationTest.php +++ b/tests/Bridge/Symfony/Bundle/DependencyInjection/ConfigurationTest.php @@ -78,6 +78,8 @@ public function testDefaultConfig() 'enable_nelmio_api_doc' => false, 'enable_swagger' => true, 'enable_swagger_ui' => true, + 'enable_entrypoint' => true, + 'enable_docs' => true, 'graphql' => [ 'enabled' => true, 'graphiql' => [ diff --git a/tests/Bridge/Symfony/Routing/ApiLoaderTest.php b/tests/Bridge/Symfony/Routing/ApiLoaderTest.php index d8e7d0404c4..7aa5f4de06c 100644 --- a/tests/Bridge/Symfony/Routing/ApiLoaderTest.php +++ b/tests/Bridge/Symfony/Routing/ApiLoaderTest.php @@ -257,7 +257,7 @@ private function getApiLoaderWithResourceMetadata(ResourceMetadata $resourceMeta $subresourceOperationFactory = new SubresourceOperationFactory($resourceMetadataFactory, $propertyNameCollectionFactoryProphecy->reveal(), $propertyMetadataFactoryProphecy->reveal(), new UnderscorePathSegmentNameGenerator()); - $apiLoader = new ApiLoader($kernelProphecy->reveal(), $resourceNameCollectionFactoryProphecy->reveal(), $resourceMetadataFactory, $operationPathResolver, $containerProphecy->reveal(), ['jsonld' => ['application/ld+json']], [], $subresourceOperationFactory, false); + $apiLoader = new ApiLoader($kernelProphecy->reveal(), $resourceNameCollectionFactoryProphecy->reveal(), $resourceMetadataFactory, $operationPathResolver, $containerProphecy->reveal(), ['jsonld' => ['application/ld+json']], [], $subresourceOperationFactory, false, true, true); return $apiLoader; }