Files
GermanAirlinesVA-GraphQL/vendor/nuwave/lighthouse/src/Schema/Directives/InjectDirective.php
T
Kilian Hofmann d8c489c714 Vendor
2021-06-01 19:55:55 +02:00

88 lines
2.7 KiB
PHP

<?php
namespace Nuwave\Lighthouse\Schema\Directives;
use Closure;
use Illuminate\Support\Arr;
use GraphQL\Type\Definition\ResolveInfo;
use Nuwave\Lighthouse\Schema\Values\FieldValue;
use Nuwave\Lighthouse\Exceptions\DirectiveException;
use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;
use Nuwave\Lighthouse\Support\Contracts\FieldMiddleware;
use Nuwave\Lighthouse\Support\Contracts\DefinedDirective;
class InjectDirective extends BaseDirective implements FieldMiddleware, DefinedDirective
{
/**
* Name of the directive.
*
* @return string
*/
public function name(): string
{
return 'inject';
}
public static function definition(): string
{
return /* @lang GraphQL */ <<<'SDL'
directive @inject(
"""
A path to the property of the context that will be injected.
If the value is nested within the context, you may use dot notation
to get it, e.g. "user.id".
"""
context: String!
"""
The target name of the argument into which the value is injected.
You can use dot notation to set the value at arbitrary depth
within the incoming argument.
"""
name: String!
) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION
SDL;
}
/**
* Resolve the field directive.
*
* @param \Nuwave\Lighthouse\Schema\Values\FieldValue $fieldValue
* @param \Closure $next
* @return \Nuwave\Lighthouse\Schema\Values\FieldValue
*
* @throws \Nuwave\Lighthouse\Exceptions\DirectiveException
*/
public function handleField(FieldValue $fieldValue, Closure $next): FieldValue
{
$contextAttributeName = $this->directiveArgValue('context');
if (! $contextAttributeName) {
throw new DirectiveException(
"The `inject` directive on {$fieldValue->getParentName()} [{$fieldValue->getFieldName()}] must have a `context` argument"
);
}
$argumentName = $this->directiveArgValue('name');
if (! $argumentName) {
throw new DirectiveException(
"The `inject` directive on {$fieldValue->getParentName()} [{$fieldValue->getFieldName()}] must have a `name` argument"
);
}
$previousResolver = $fieldValue->getResolver();
return $next(
$fieldValue->setResolver(
function ($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo) use ($contextAttributeName, $argumentName, $previousResolver) {
return $previousResolver(
$rootValue,
Arr::add($args, $argumentName, data_get($context, $contextAttributeName)),
$context,
$resolveInfo
);
}
)
);
}
}