<?php namespace MyProject\GraphQL; use SilverStripe\GraphQL\Schema\Field\ModelQuery; use SilverStripe\GraphQL\Schema\Interfaces\ModelQueryPlugin; use SilverStripe\GraphQL\Schema\Interfaces\SchemaUpdater; use SilverStripe\GraphQL\Schema\Schema; use SilverStripe\GraphQL\Schema\Type\Enum; use TractorCow\Fluent\Model\Locale; use TractorCow\Fluent\State\FluentState; class FluentQueryPlugin implements ModelQueryPlugin, SchemaUpdater { public function getIdentifier(): string { return 'fluentLocale'; } public static function updateSchema(Schema $schema): void { $locales = Locale::getLocales()->map('ID', 'Locale')->values(); $locales = array_combine($locales, $locales); $enum = Enum::create('FluentLocale', $locales, 'The locales available'); $schema->addEnum($enum); } public function apply(ModelQuery $query, Schema $schema, array $config = []): void { $queryType = $schema->getQueryType(); // Ensure that we only apply the Locale variable to root queries. // Nested queries with their own locales is super edge-casey and weird. if (!$queryType->getFieldByName($query->getName())) { return; } $query->addArg('locale', 'FluentLocale!'); $query->addResolverMiddleware([static::class, 'setLocale']); } public static function setLocale($obj, $args, $context) { FluentState::singleton()->setLocale($args['locale']); return $obj; } }