88namespace Magento \GraphQlResolverCache \Model \Resolver \Result ;
99
1010use Magento \Framework \GraphQl \Query \ResolverInterface ;
11+ use Magento \Framework \GraphQl \Schema \Type \ResolveInfo ;
1112use Magento \Framework \ObjectManagerInterface ;
1213use Magento \GraphQlResolverCache \Model \Resolver \Result \ValueProcessor \FlagSetter \FlagSetterInterface ;
1314use Magento \GraphQlResolverCache \Model \Resolver \Result \ValueProcessor \FlagGetter \FlagGetterInterface ;
@@ -40,7 +41,7 @@ class ValueProcessor implements ValueProcessorInterface
4041 /**
4142 * @var array
4243 */
43- private array $ resolverProcessingFlagConfig ;
44+ private array $ typeConfig ;
4445
4546 /**
4647 * @var ObjectManagerInterface
@@ -61,53 +62,58 @@ class ValueProcessor implements ValueProcessorInterface
6162 * @param HydratorProviderInterface $hydratorProvider
6263 * @param DehydratorProviderInterface $dehydratorProvider
6364 * @param ObjectManagerInterface $objectManager
64- * @param array $resolverProcessingFlagConfig
65+ * @param FlagGetterInterface $defaultFlagGetter
66+ * @param FlagSetterInterface $defaultFlagSetter
67+ * @param array $typeConfig
6568 */
6669 public function __construct (
6770 HydratorProviderInterface $ hydratorProvider ,
6871 DehydratorProviderInterface $ dehydratorProvider ,
6972 ObjectManagerInterface $ objectManager ,
70- array $ resolverProcessingFlagConfig = []
73+ FlagGetterInterface $ defaultFlagGetter ,
74+ FlagSetterInterface $ defaultFlagSetter ,
75+ array $ typeConfig = []
7176 ) {
7277 $ this ->hydratorProvider = $ hydratorProvider ;
7378 $ this ->dehydratorProvider = $ dehydratorProvider ;
74- $ this ->resolverProcessingFlagConfig = $ resolverProcessingFlagConfig ;
79+ $ this ->typeConfig = $ typeConfig ;
7580 $ this ->objectManager = $ objectManager ;
76- $ this ->defaultFlagGetter = $ this -> objectManager -> get (FlagGetterInterface::class) ;
77- $ this ->defaultFlagSetter = $ this -> objectManager -> get (FlagSetterInterface::class) ;
81+ $ this ->defaultFlagGetter = $ defaultFlagGetter ;
82+ $ this ->defaultFlagSetter = $ defaultFlagSetter ;
7883 }
7984
8085 /**
81- * Get flag setter fr the given resolver.
82- *
83- * @param ResolverInterface $resolver
86+ * Get flag setter for the resolver return type.
8487 *
88+ * @param ResolveInfo $info
8589 * @return FlagSetterInterface
8690 */
87- private function getFlagSetterForResolver ( ResolverInterface $ resolver ): FlagSetterInterface
91+ private function getFlagSetterForType ( ResolveInfo $ info ): FlagSetterInterface
8892 {
89- foreach ($ this ->getResolverClassChain ($ resolver ) as $ className ) {
90- if (isset ($ this ->resolverProcessingFlagConfig ['setters ' ][$ className ])) {
91- return $ this ->objectManager ->get (
92- $ this ->resolverProcessingFlagConfig ['setters ' ][$ className ]
93- );
94- }
93+ if (isset ($ this ->typeConfig ['setters ' ][get_class ($ info ->returnType )])) {
94+ return $ this ->objectManager ->get (
95+ $ this ->typeConfig ['setters ' ][get_class ($ info ->returnType )]
96+ );
9597 }
96- return $ this ->objectManager -> get (FlagSetterInterface::class) ;
98+ return $ this ->defaultFlagSetter ;
9799 }
98100
99101 /**
100102 * @inheritdoc
101103 */
102- public function processCachedValueAfterLoad (ResolverInterface $ resolver , string $ cacheKey , &$ value ): void
103- {
104+ public function processCachedValueAfterLoad (
105+ ResolveInfo $ info ,
106+ ResolverInterface $ resolver ,
107+ string $ cacheKey ,
108+ &$ value
109+ ): void {
104110 if ($ value === null ) {
105111 return ;
106112 }
107113 $ hydrator = $ this ->hydratorProvider ->getHydratorForResolver ($ resolver );
108114 if ($ hydrator ) {
109115 $ this ->hydrators [$ cacheKey ] = $ hydrator ;
110- $ this ->getFlagSetterForResolver ( $ resolver )->setFlagOnValue ($ value , $ cacheKey );
116+ $ this ->getFlagSetterForType ( $ info )->setFlagOnValue ($ value , $ cacheKey );
111117 }
112118 }
113119
@@ -127,11 +133,15 @@ public function preProcessParentValue(array &$value): void
127133 */
128134 private function hydrateData (&$ value )
129135 {
136+ if ($ value === null ) {
137+ return ;
138+ }
139+ // the parent value is always a single object that contains currently resolved value
130140 $ reference = $ this ->defaultFlagGetter ->getFlagFromValue ($ value ) ?? null ;
131141 if (isset ($ reference ['cacheKey ' ]) && isset ($ reference ['index ' ])) {
132142 $ cacheKey = $ reference ['cacheKey ' ];
133143 $ index = $ reference ['index ' ];
134- if ($ value && $ cacheKey ) {
144+ if ($ cacheKey ) {
135145 if (isset ($ this ->processedValues [$ cacheKey ][$ index ])) {
136146 $ value = $ this ->processedValues [$ cacheKey ][$ index ];
137147 } elseif (isset ($ this ->hydrators [$ cacheKey ])
@@ -155,19 +165,4 @@ public function preProcessValueBeforeCacheSave(ResolverInterface $resolver, &$va
155165 $ dehydrator ->dehydrate ($ value );
156166 }
157167 }
158-
159- /**
160- * Get class inheritance chain for the given resolver object.
161- *
162- * @param ResolverInterface $resolver
163- * @return array
164- */
165- private function getResolverClassChain (ResolverInterface $ resolver ): array
166- {
167- $ resolverClasses = [trim (get_class ($ resolver ), '\\' )];
168- foreach (class_parents ($ resolver ) as $ classParent ) {
169- $ resolverClasses [] = trim ($ classParent , '\\' );
170- }
171- return $ resolverClasses ;
172- }
173168}
0 commit comments