diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php index 2ab9ee241086b..00ee9f27ca377 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php @@ -45,11 +45,12 @@ public function __construct( public function dehydrate(array &$resolvedValue): void { if (count($resolvedValue) > 0) { - $keys = array_keys($resolvedValue); - $firstKey = array_pop($keys); + $firstKey = array_key_first($resolvedValue); $this->dehydrateMediaGalleryEntity($resolvedValue[$firstKey]); - foreach ($keys as $key) { - $resolvedValue[$key]['model_info'] = &$resolvedValue[$firstKey]['model_info']; + foreach ($resolvedValue as $key => &$value) { + if ($key !== $firstKey) { + unset($value['model']); + } } } } diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelHydrator.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelHydrator.php index f15bc9ef0dbc8..d59497b30af61 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelHydrator.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelHydrator.php @@ -11,11 +11,12 @@ use Magento\Catalog\Model\ProductFactory; use Magento\Framework\EntityManager\HydratorPool; use Magento\GraphQlResolverCache\Model\Resolver\Result\HydratorInterface; +use Magento\GraphQlResolverCache\Model\Resolver\Result\PrehydratorInterface; /** * Product resolver data hydrator to rehydrate propagated model. */ -class ProductModelHydrator implements HydratorInterface +class ProductModelHydrator implements HydratorInterface, PrehydratorInterface { /** * @var ProductFactory @@ -62,4 +63,15 @@ public function hydrate(array &$resolverData): void unset($resolverData['model_info']); } } + + /** + * @inheritDoc + */ + public function prehydrate(array &$resolverData): void + { + $firstKey = array_key_first($resolverData); + foreach ($resolverData as &$value) { + $value['model_info'] = &$resolverData[$firstKey]['model_info']; + } + } } diff --git a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorComposite.php b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorComposite.php index d08323f2efddf..f88e3ecb9b91b 100644 --- a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorComposite.php +++ b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorComposite.php @@ -10,15 +10,15 @@ /** * Composite hydrator for resolver result data. */ -class HydratorComposite implements HydratorInterface +class HydratorComposite implements HydratorInterface, PrehydratorInterface { /** - * @var HydratorInterface[] + * @var HydratorInterface[]|PrehydratorInterface[] */ private array $hydrators = []; /** - * @param HydratorInterface[] $hydrators + * @param HydratorInterface[]|PrehydratorInterface[] $hydrators */ public function __construct(array $hydrators = []) { @@ -34,7 +34,24 @@ public function hydrate(array &$resolverData): void return; } foreach ($this->hydrators as $hydrator) { - $hydrator->hydrate($resolverData); + if ($hydrator instanceof HydratorInterface) { + $hydrator->hydrate($resolverData); + } + } + } + + /** + * @inheritDoc + */ + public function prehydrate(array &$resolverData): void + { + if (empty($resolverData)) { + return; + } + foreach ($this->hydrators as $hydrator) { + if ($hydrator instanceof PrehydratorInterface) { + $hydrator->prehydrate($resolverData); + } } } } diff --git a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorInterface.php b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorInterface.php index 95660f6ed5771..98698f49bc04d 100644 --- a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorInterface.php +++ b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorInterface.php @@ -13,7 +13,7 @@ interface HydratorInterface { /** - * Hydrate resolved data. + * Hydrates resolved data before passing to child resolver. * * @param array $resolverData * @return void diff --git a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/PrehydratorInterface.php b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/PrehydratorInterface.php new file mode 100644 index 0000000000000..120b4d45f9519 --- /dev/null +++ b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/PrehydratorInterface.php @@ -0,0 +1,22 @@ +hydratorProvider->getHydratorForResolver($resolver); if ($hydrator) { $this->hydrators[$cacheKey] = $hydrator; + $hydrator->prehydrate($value); $this->getFlagSetterForType($info)->setFlagOnValue($value, $cacheKey); } } diff --git a/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php b/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php index 635c23237d838..7c912ff411195 100644 --- a/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php +++ b/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php @@ -7,6 +7,7 @@ namespace Magento\GraphQlResolverCache\Model\Resolver\Result; +use Magento\CatalogGraphQl\Model\Resolver\Cache\Product\MediaGallery\ProductModelHydrator; use Magento\Framework\DataObject; use Magento\Framework\GraphQl\Query\ResolverInterface; use Magento\StoreGraphQl\Model\Resolver\StoreConfigResolver; @@ -102,10 +103,10 @@ public function testHydratorChainProvider() unset($resolverData['model']); }); - $testModelHydrator = $this->getMockBuilder(HydratorInterface::class) + $testModelHydrator = $this->getMockBuilder(ProductModelHydrator::class) ->disableOriginalConstructor() ->setMockClassName('TestResolverModelHydrator') - ->onlyMethods(['hydrate']) + ->onlyMethods(['hydrate', 'prehydrate']) ->getMock(); $testModelHydrator->expects($this->once()) ->method('hydrate') @@ -154,6 +155,7 @@ public function testHydratorChainProvider() $this->objectManager->removeSharedInstance('TestResolverModelHydrator'); $this->objectManager->removeSharedInstance('TestResolverNestedItemsHydrator'); + $this->objectManager->removeSharedInstance('TestResolverModelDehydrator'); } /**