hydratorProvider = $hydratorProvider; $this->dehydratorProvider = $dehydratorProvider; $this->typeConfig = $typeConfig; $this->objectManager = $objectManager; $this->defaultFlagGetter = $defaultFlagGetter; $this->defaultFlagSetter = $defaultFlagSetter; } /** * Get flag setter for the resolver return type. * * @param ResolveInfo $info * @return FlagSetterInterface */ private function getFlagSetterForType(ResolveInfo $info): FlagSetterInterface { if (isset($this->typeConfig['setters'][get_class($info->returnType)])) { return $this->objectManager->get( $this->typeConfig['setters'][get_class($info->returnType)] ); } return $this->defaultFlagSetter; } /** * @inheritdoc */ public function processCachedValueAfterLoad( ResolveInfo $info, ResolverInterface $resolver, string $cacheKey, &$value ): void { if ($value === null) { return; } $hydrator = $this->hydratorProvider->getHydratorForResolver($resolver); if ($hydrator) { $this->hydrators[$cacheKey] = $hydrator; $hydrator->prehydrate($value); $this->getFlagSetterForType($info)->setFlagOnValue($value, $cacheKey); } } /** * @inheritdoc */ public function preProcessParentValue(array &$value): void { $this->hydrateData($value); } /** * Perform data hydration. * * @param array $value * @return void */ private function hydrateData(array &$value): void { // the parent value is always a single object that contains currently resolved value $reference = $this->defaultFlagGetter->getFlagFromValue($value) ?? null; if (isset($reference['cacheKey']) && isset($reference['index'])) { $cacheKey = $reference['cacheKey']; $index = $reference['index']; if (isset($this->processedValues[$cacheKey][$index])) { $value = $this->processedValues[$cacheKey][$index]; } elseif (isset($this->hydrators[$cacheKey]) && $this->hydrators[$cacheKey] instanceof HydratorInterface ) { $this->hydrators[$cacheKey]->hydrate($value); $this->defaultFlagSetter->unsetFlagFromValue($value); $this->processedValues[$cacheKey][$index] = $value; } } } /** * @inheritdoc */ public function preProcessValueBeforeCacheSave(ResolverInterface $resolver, &$value): void { $dehydrator = $this->dehydratorProvider->getDehydratorForResolver($resolver); if ($dehydrator) { $dehydrator->dehydrate($value); } } /** * @inheritDoc */ public function _resetState(): void { $this->hydrators = []; $this->processedValues = []; } }