From 0c16bff35b90c4b192333d969832694c5442c222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Fri, 7 Apr 2017 15:05:13 +0200 Subject: [PATCH 1/2] Refresh routes when an entity is created --- .../DependencyInjection/ApiPlatformExtension.php | 7 ++++--- src/Bridge/Symfony/Bundle/Resources/config/api.xml | 1 + src/Bridge/Symfony/Routing/ApiLoader.php | 10 ++++++++-- .../DependencyInjection/ApiPlatformExtensionTest.php | 3 ++- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php b/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php index 4d9ab000c8f..b246dfd7522 100644 --- a/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php +++ b/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php @@ -258,7 +258,7 @@ private function registerCacheConfiguration(ContainerBuilder $container) */ private function registerLoaders(ContainerBuilder $container, array $bundles) { - $annotationPaths = []; + $resourceClassDirectories = []; $yamlResources = []; $xmlResources = []; @@ -267,12 +267,13 @@ private function registerLoaders(ContainerBuilder $container, array $bundles) $this->addFileResources($bundleDirectory, $xmlResources, $yamlResources); if (file_exists($entityDirectory = $bundleDirectory.'/Entity')) { - $annotationPaths[] = $entityDirectory; + $resourceClassDirectories[] = $entityDirectory; $container->addResource(new DirectoryResource($entityDirectory, '/\.php$/')); } } - $container->getDefinition('api_platform.metadata.resource.name_collection_factory.annotation')->addArgument($annotationPaths); + $container->setParameter('api_platform.resource_class_directories', $resourceClassDirectories); + $container->getDefinition('api_platform.metadata.resource.name_collection_factory.annotation')->addArgument('%api_platform.resource_class_directories%'); $container->getDefinition('api_platform.metadata.extractor.yaml')->addArgument($yamlResources); $container->getDefinition('api_platform.metadata.extractor.xml')->addArgument($xmlResources); } diff --git a/src/Bridge/Symfony/Bundle/Resources/config/api.xml b/src/Bridge/Symfony/Bundle/Resources/config/api.xml index 27337a1fa19..b0ebd87f737 100644 --- a/src/Bridge/Symfony/Bundle/Resources/config/api.xml +++ b/src/Bridge/Symfony/Bundle/Resources/config/api.xml @@ -35,6 +35,7 @@ %api_platform.formats% + %api_platform.resource_class_directories% diff --git a/src/Bridge/Symfony/Routing/ApiLoader.php b/src/Bridge/Symfony/Routing/ApiLoader.php index 1a13c76688d..24cb18cc4ea 100644 --- a/src/Bridge/Symfony/Routing/ApiLoader.php +++ b/src/Bridge/Symfony/Routing/ApiLoader.php @@ -21,6 +21,7 @@ use Doctrine\Common\Inflector\Inflector; use Symfony\Component\Config\FileLocator; use Symfony\Component\Config\Loader\Loader; +use Symfony\Component\Config\Resource\DirectoryResource; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpKernel\KernelInterface; use Symfony\Component\Routing\Loader\XmlFileLoader; @@ -43,8 +44,9 @@ final class ApiLoader extends Loader private $operationPathResolver; private $container; private $formats; + private $resourceClassDirectories; - public function __construct(KernelInterface $kernel, ResourceNameCollectionFactoryInterface $resourceNameCollectionFactory, ResourceMetadataFactoryInterface $resourceMetadataFactory, OperationPathResolverInterface $operationPathResolver, ContainerInterface $container, array $formats) + public function __construct(KernelInterface $kernel, ResourceNameCollectionFactoryInterface $resourceNameCollectionFactory, ResourceMetadataFactoryInterface $resourceMetadataFactory, OperationPathResolverInterface $operationPathResolver, ContainerInterface $container, array $formats, array $resourceClassDirectories = []) { $this->fileLoader = new XmlFileLoader(new FileLocator($kernel->locateResource('@ApiPlatformBundle/Resources/config/routing'))); $this->resourceNameCollectionFactory = $resourceNameCollectionFactory; @@ -52,14 +54,18 @@ public function __construct(KernelInterface $kernel, ResourceNameCollectionFacto $this->operationPathResolver = $operationPathResolver; $this->container = $container; $this->formats = $formats; + $this->resourceClassDirectories = $resourceClassDirectories; } /** * {@inheritdoc} */ - public function load($data, $type = null) + public function load($data, $type = null): RouteCollection { $routeCollection = new RouteCollection(); + foreach ($this->resourceClassDirectories as $directory) { + $routeCollection->addResource(new DirectoryResource($directory, '/\.php$/')); + } $this->loadExternalFiles($routeCollection); diff --git a/tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php b/tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php index 87b094f454d..24da5be5ebe 100644 --- a/tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php +++ b/tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php @@ -210,6 +210,7 @@ private function getContainerBuilderProphecy() 'api_platform.eager_loading.enabled' => Argument::type('bool'), 'api_platform.eager_loading.max_joins' => 30, 'api_platform.eager_loading.force_eager' => true, + 'api_platform.resource_class_directories' => [], ]; foreach ($parameters as $key => $value) { $containerBuilderProphecy->setParameter($key, $value)->shouldBeCalled(); @@ -219,7 +220,7 @@ private function getContainerBuilderProphecy() $containerBuilderProphecy->hasExtension('http://symfony.com/schema/dic/services')->shouldBeCalled(); $definitionProphecy = $this->prophesize(Definition::class); - $definitionProphecy->addArgument([])->shouldBeCalled(); + $definitionProphecy->addArgument('%api_platform.resource_class_directories%')->shouldBeCalled(); $containerBuilderProphecy->getDefinition('api_platform.metadata.resource.name_collection_factory.annotation')->willReturn($definitionProphecy->reveal())->shouldBeCalled(); foreach (['yaml', 'xml'] as $format) { From bb6f0abc9b44efba5d3a178b24f760119b890f65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Sat, 8 Apr 2017 10:23:04 +0200 Subject: [PATCH 2/2] Fix CS --- .../Doctrine/Orm/Extension/FilterEagerLoadingExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php b/src/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php index 97eb130a382..b1f6ecd0b49 100644 --- a/src/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php +++ b/src/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php @@ -160,7 +160,7 @@ private function hasFetchEagerAssociation(EntityManager $em, ClassMetadataInfo $ $related = $em->getClassMetadata($mapping['targetEntity']); - if (in_array($related->name, $checked)) { + if (in_array($related->name, $checked, true)) { continue; }