From 09441afbc042c62b0cb518b0e4004470dffafddd Mon Sep 17 00:00:00 2001 From: Muhamad Surya Iksanudin Date: Wed, 7 Mar 2018 07:05:47 +0700 Subject: [PATCH 1/3] Add query extension when using custom data provider When using custom data provider the query extensions is not working properly. By applying this PR, we can inject the query extension based on service tag. But we have problem with autowire service because the compiler execute before autowire, can you help us to fix this problem? --- .../Compiler/DoctrineQueryExtensionPass.php | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/Bridge/Symfony/Bundle/DependencyInjection/Compiler/DoctrineQueryExtensionPass.php b/src/Bridge/Symfony/Bundle/DependencyInjection/Compiler/DoctrineQueryExtensionPass.php index 0620c330312..5151526df23 100644 --- a/src/Bridge/Symfony/Bundle/DependencyInjection/Compiler/DoctrineQueryExtensionPass.php +++ b/src/Bridge/Symfony/Bundle/DependencyInjection/Compiler/DoctrineQueryExtensionPass.php @@ -39,16 +39,35 @@ public function process(ContainerBuilder $container) return; } - $collectionDataProviderDefinition = $container->getDefinition('api_platform.doctrine.orm.collection_data_provider'); - $itemDataProviderDefinition = $container->getDefinition('api_platform.doctrine.orm.item_data_provider'); - $subresourceDataProviderDefinition = $container->getDefinition('api_platform.doctrine.orm.subresource_data_provider'); + $collectionDataProviders = $this->findAndSortTaggedServices('api_platform.collection_data_provider', $container); + $itemDataProviders = $this->findAndSortTaggedServices('api_platform.item_data_provider', $container); + $subresourceDataProviders = $this->findAndSortTaggedServices('api_platform.subresource_data_provider', $container); $collectionExtensions = $this->findAndSortTaggedServices('api_platform.doctrine.orm.query_extension.collection', $container); $itemExtensions = $this->findAndSortTaggedServices('api_platform.doctrine.orm.query_extension.item', $container); - $collectionDataProviderDefinition->replaceArgument(1, $collectionExtensions); - $itemDataProviderDefinition->replaceArgument(3, $itemExtensions); - $subresourceDataProviderDefinition->replaceArgument(3, $collectionExtensions); - $subresourceDataProviderDefinition->replaceArgument(4, $itemExtensions); + foreach ($collectionDataProviders as $collectionDataProvider) { + $definition = $container->getDefinition((string) $collectionDataProvider); + try { + $definition->replaceArgument(1, $collectionExtensions); + } catch (OutOfBoundsException $exception) { + $definition->addArgument($collectionExtensions); + } + } + + foreach ($itemDataProviders as $itemDataProvider) { + $container->getDefinition((string) $itemDataProvider)->replaceArgument(3, $itemExtensions); + } + + foreach ($subresourceDataProviders as $subresourceDataProvider) { + $definition = $container->getDefinition((string) $subresourceDataProvider); + try { + $definition->replaceArgument(3, $collectionExtensions); + $definition->replaceArgument(4, $itemExtensions); + } catch (OutOfBoundsException $exception) { + $definition->addArgument($collectionExtensions); + $definition->addArgument($itemExtensions); + } + } } } From 27c77a5ea5f4a01d30868f453f94b0f292a9b9f3 Mon Sep 17 00:00:00 2001 From: Muhamad Surya Iksanudin Date: Wed, 7 Mar 2018 10:37:47 +0700 Subject: [PATCH 2/3] update update --- .../DependencyInjection/Compiler/DoctrineQueryExtensionPass.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Bridge/Symfony/Bundle/DependencyInjection/Compiler/DoctrineQueryExtensionPass.php b/src/Bridge/Symfony/Bundle/DependencyInjection/Compiler/DoctrineQueryExtensionPass.php index 5151526df23..3b9adfd4eec 100644 --- a/src/Bridge/Symfony/Bundle/DependencyInjection/Compiler/DoctrineQueryExtensionPass.php +++ b/src/Bridge/Symfony/Bundle/DependencyInjection/Compiler/DoctrineQueryExtensionPass.php @@ -16,6 +16,7 @@ use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\Compiler\PriorityTaggedServiceTrait; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException; /** * Injects query extensions. From 53450de636b7c2ff27b429b10eb61697b33865e7 Mon Sep 17 00:00:00 2001 From: Muhamad Surya Iksanudin Date: Wed, 7 Mar 2018 10:42:43 +0700 Subject: [PATCH 3/3] bugfix bugfix --- .../Compiler/DoctrineQueryExtensionPass.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Bridge/Symfony/Bundle/DependencyInjection/Compiler/DoctrineQueryExtensionPass.php b/src/Bridge/Symfony/Bundle/DependencyInjection/Compiler/DoctrineQueryExtensionPass.php index 3b9adfd4eec..eb2d04b648d 100644 --- a/src/Bridge/Symfony/Bundle/DependencyInjection/Compiler/DoctrineQueryExtensionPass.php +++ b/src/Bridge/Symfony/Bundle/DependencyInjection/Compiler/DoctrineQueryExtensionPass.php @@ -57,7 +57,12 @@ public function process(ContainerBuilder $container) } foreach ($itemDataProviders as $itemDataProvider) { - $container->getDefinition((string) $itemDataProvider)->replaceArgument(3, $itemExtensions); + $definition = $container->getDefinition((string) $itemDataProvider); + try { + $definition->replaceArgument(3, $itemExtensions); + } catch (OutOfBoundsException $exception) { + $definition->addArgument($itemExtensions); + } } foreach ($subresourceDataProviders as $subresourceDataProvider) {