8
8
namespace Magento \GraphQlResolverCache \Model \Resolver \Result ;
9
9
10
10
use Magento \Framework \GraphQl \Query \ResolverInterface ;
11
+ use Magento \Framework \GraphQl \Schema \Type \ResolveInfo ;
11
12
use Magento \Framework \ObjectManagerInterface ;
12
13
use Magento \GraphQlResolverCache \Model \Resolver \Result \ValueProcessor \FlagSetter \FlagSetterInterface ;
13
14
use Magento \GraphQlResolverCache \Model \Resolver \Result \ValueProcessor \FlagGetter \FlagGetterInterface ;
@@ -40,7 +41,7 @@ class ValueProcessor implements ValueProcessorInterface
40
41
/**
41
42
* @var array
42
43
*/
43
- private array $ resolverProcessingFlagConfig ;
44
+ private array $ typeConfig ;
44
45
45
46
/**
46
47
* @var ObjectManagerInterface
@@ -61,53 +62,58 @@ class ValueProcessor implements ValueProcessorInterface
61
62
* @param HydratorProviderInterface $hydratorProvider
62
63
* @param DehydratorProviderInterface $dehydratorProvider
63
64
* @param ObjectManagerInterface $objectManager
64
- * @param array $resolverProcessingFlagConfig
65
+ * @param FlagGetterInterface $defaultFlagGetter
66
+ * @param FlagSetterInterface $defaultFlagSetter
67
+ * @param array $typeConfig
65
68
*/
66
69
public function __construct (
67
70
HydratorProviderInterface $ hydratorProvider ,
68
71
DehydratorProviderInterface $ dehydratorProvider ,
69
72
ObjectManagerInterface $ objectManager ,
70
- array $ resolverProcessingFlagConfig = []
73
+ FlagGetterInterface $ defaultFlagGetter ,
74
+ FlagSetterInterface $ defaultFlagSetter ,
75
+ array $ typeConfig = []
71
76
) {
72
77
$ this ->hydratorProvider = $ hydratorProvider ;
73
78
$ this ->dehydratorProvider = $ dehydratorProvider ;
74
- $ this ->resolverProcessingFlagConfig = $ resolverProcessingFlagConfig ;
79
+ $ this ->typeConfig = $ typeConfig ;
75
80
$ 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 ;
78
83
}
79
84
80
85
/**
81
- * Get flag setter fr the given resolver.
82
- *
83
- * @param ResolverInterface $resolver
86
+ * Get flag setter for the resolver return type.
84
87
*
88
+ * @param ResolveInfo $info
85
89
* @return FlagSetterInterface
86
90
*/
87
- private function getFlagSetterForResolver ( ResolverInterface $ resolver ): FlagSetterInterface
91
+ private function getFlagSetterForType ( ResolveInfo $ info ): FlagSetterInterface
88
92
{
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
+ );
95
97
}
96
- return $ this ->objectManager -> get (FlagSetterInterface::class) ;
98
+ return $ this ->defaultFlagSetter ;
97
99
}
98
100
99
101
/**
100
102
* @inheritdoc
101
103
*/
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 {
104
110
if ($ value === null ) {
105
111
return ;
106
112
}
107
113
$ hydrator = $ this ->hydratorProvider ->getHydratorForResolver ($ resolver );
108
114
if ($ hydrator ) {
109
115
$ this ->hydrators [$ cacheKey ] = $ hydrator ;
110
- $ this ->getFlagSetterForResolver ( $ resolver )->setFlagOnValue ($ value , $ cacheKey );
116
+ $ this ->getFlagSetterForType ( $ info )->setFlagOnValue ($ value , $ cacheKey );
111
117
}
112
118
}
113
119
@@ -127,11 +133,15 @@ public function preProcessParentValue(array &$value): void
127
133
*/
128
134
private function hydrateData (&$ value )
129
135
{
136
+ if ($ value === null ) {
137
+ return ;
138
+ }
139
+ // the parent value is always a single object that contains currently resolved value
130
140
$ reference = $ this ->defaultFlagGetter ->getFlagFromValue ($ value ) ?? null ;
131
141
if (isset ($ reference ['cacheKey ' ]) && isset ($ reference ['index ' ])) {
132
142
$ cacheKey = $ reference ['cacheKey ' ];
133
143
$ index = $ reference ['index ' ];
134
- if ($ value && $ cacheKey ) {
144
+ if ($ cacheKey ) {
135
145
if (isset ($ this ->processedValues [$ cacheKey ][$ index ])) {
136
146
$ value = $ this ->processedValues [$ cacheKey ][$ index ];
137
147
} elseif (isset ($ this ->hydrators [$ cacheKey ])
@@ -155,19 +165,4 @@ public function preProcessValueBeforeCacheSave(ResolverInterface $resolver, &$va
155
165
$ dehydrator ->dehydrate ($ value );
156
166
}
157
167
}
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
- }
173
168
}
0 commit comments