1616use Drupal \graphql \Plugin \GraphQL \Traits \DeprecatablePluginTrait ;
1717use Drupal \graphql \Plugin \GraphQL \Traits \DescribablePluginTrait ;
1818use Drupal \graphql \Plugin \GraphQL \Traits \TypedPluginTrait ;
19- use Drupal \graphql \Plugin \LanguageNegotiation \LanguageNegotiationGraphQL ;
2019use Drupal \graphql \Plugin \SchemaBuilderInterface ;
2120use GraphQL \Deferred ;
2221use GraphQL \Type \Definition \ListOfType ;
@@ -44,6 +43,13 @@ abstract class FieldPluginBase extends PluginBase implements FieldPluginInterfac
4443 */
4544 protected $ renderer ;
4645
46+ /**
47+ * Static cache for `isLanguageAwareField()`
48+ *
49+ * @var boolean
50+ */
51+ protected $ isLanguageAware = NULL ;
52+
4753 /**
4854 * {@inheritdoc}
4955 */
@@ -118,20 +124,10 @@ public function resolve($value, array $args, ResolveContext $context, ResolveInf
118124 if (array_key_exists ($ argument , $ args ) && !is_null ($ args [$ argument ])) {
119125 $ context ->setContext ($ argument , $ args [$ argument ], $ info );
120126 }
121- else {
122- $ args [$ argument ] = $ context ->getContext ($ argument , $ info );
123- }
127+ $ args [$ argument ] = $ context ->getContext ($ argument , $ info );
124128 }
125129
126- if ($ this ->isLanguageAwareField ()) {
127- return $ this ->getLanguageContext ()
128- ->executeInLanguageContext (function () use ($ value , $ args , $ context , $ info ) {
129- return $ this ->resolveDeferred ([$ this , 'resolveValues ' ], $ value , $ args , $ context , $ info );
130- }, $ context ->getContext ('language ' , $ info ));
131- }
132- else {
133- return $ this ->resolveDeferred ([$ this , 'resolveValues ' ], $ value , $ args , $ context , $ info );
134- }
130+ return $ this ->resolveDeferred ([$ this , 'resolveValues ' ], $ value , $ args , $ context , $ info );
135131 }
136132
137133 /**
@@ -143,33 +139,56 @@ public function resolve($value, array $args, ResolveContext $context, ResolveInf
143139 * The fields language awareness status.
144140 */
145141 protected function isLanguageAwareField () {
146- return (boolean ) count (array_filter ($ this ->getPluginDefinition ()['response_cache_contexts ' ], function ($ context ) {
147- return strpos ($ context , 'languages: ' ) === 0 ;
148- }));
142+ if (is_null ($ this ->isLanguageAware )) {
143+ $ this ->isLanguageAware = (boolean ) count (array_filter ($ this ->getPluginDefinition ()['response_cache_contexts ' ], function ($ context ) {
144+ return strpos ($ context , 'languages: ' ) === 0 ;
145+ }));
146+ }
147+ return $ this ->isLanguageAware ;
149148 }
150149
151150 /**
152151 * {@inheritdoc}
153152 */
154153 protected function resolveDeferred (callable $ callback , $ value , array $ args , ResolveContext $ context , ResolveInfo $ info ) {
154+ $ isLanguageAware = $ this ->isLanguageAwareField ();
155+ $ languageContext = $ this ->getLanguageContext ();
156+
155157 $ renderContext = new RenderContext ();
156158
157- $ result = $ this ->getRenderer ()->executeInRenderContext ($ renderContext , function () use ($ callback , $ value , $ args , $ context , $ info ) {
158- $ result = $ callback ($ value , $ args , $ context , $ info );
159- if ($ result instanceof \Generator) {
160- $ result = iterator_to_array ($ result );
161- }
162- return $ result ;
163- });
159+ $ executor = function () use ($ callback , $ renderContext , $ value , $ args , $ context , $ info ) {
160+ return $ this ->getRenderer ()->executeInRenderContext ($ renderContext , function () use ($ callback , $ value , $ args , $ context , $ info ) {
161+ $ result = $ callback ($ value , $ args , $ context , $ info );
162+ if ($ result instanceof \Generator) {
163+ $ result = iterator_to_array ($ result );
164+ }
165+ return $ result ;
166+ });
167+ };
168+
169+ $ result = $ isLanguageAware
170+ ? $ languageContext ->executeInLanguageContext ($ executor , $ context ->getContext ('language ' , $ info ))
171+ : $ executor ();
164172
165173 if (!$ renderContext ->isEmpty () && $ info ->operation ->operation === 'query ' ) {
166174 $ context ->addCacheableDependency ($ renderContext ->pop ());
167175 }
168176
169177 if (is_callable ($ result )) {
170- return new Deferred (function () use ($ result , $ value , $ args , $ context , $ info ) {
171- return $ this ->resolveDeferred ($ result , $ value , $ args , $ context , $ info );
172- });
178+ return new Deferred (
179+ function () use ($ result , $ value , $ args , $ context , $ info , $ isLanguageAware , $ languageContext ) {
180+ if ($ isLanguageAware ) {
181+ return $ languageContext
182+ ->executeInLanguageContext (
183+ function () use ($ result , $ value , $ args , $ context , $ info ) {
184+ return $ this ->resolveDeferred ($ result , $ value , $ args , $ context , $ info );
185+ },
186+ $ context ->getContext ('language ' , $ info )
187+ );
188+ }
189+ return $ this ->resolveDeferred ($ result , $ value , $ args , $ context , $ info );
190+ }
191+ );
173192 }
174193
175194 // Only collect cache metadata if this is a query. All other operation types
0 commit comments