Как получить пользовательские аргументы директивы в маяке graphql laravel - PullRequest
2 голосов
/ 20 апреля 2020

Мой вопрос касается пользовательских директив https://lighthouse-php.com/4.11/the-basics/directives.html#definition

Моя схема:

type Query {
  sayFriendly: String @append(text: ", please.")
}

в маяке. php Конфиг, у меня уже есть Директива

'namespaces' => [
        'models' => ['App', 'App\\Models'],
        'queries' => 'App\\GraphQL\\Queries',
        'mutations' => 'App\\GraphQL\\Mutations',
        'subscriptions' => 'App\\GraphQL\\Subscriptions',
        'interfaces' => 'App\\GraphQL\\Interfaces',
        'unions' => 'App\\GraphQL\\Unions',
        'scalars' => 'App\\GraphQL\\Scalars',
        'directives' => ['App\\GraphQL\\Directives'],
    ],

включена.

Я определил директиву в \ App \ GraphQL \ Directives \ appendDirective как

<?php

namespace App\GraphQL\Directives;

use Closure;
use GraphQL\Type\Definition\ResolveInfo;
use Nuwave\Lighthouse\Schema\Values\FieldValue;
use Nuwave\Lighthouse\Support\Contracts\Directive;
use Nuwave\Lighthouse\Support\Contracts\FieldMiddleware;
use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;

class appendDirective implements Directive, FieldMiddleware
{
    /**
     * Name of the directive as used in the schema.
     *
     * @return string
     */
    public function name(): string
    {
        return 'append';
    }

    /**
     * Wrap around the final field resolver.
     *
     * @param \Nuwave\Lighthouse\Schema\Values\FieldValue $fieldValue
     * @param \Closure $next
     * @return \Nuwave\Lighthouse\Schema\Values\FieldValue
     */
    public function handleField(FieldValue $fieldValue, Closure $next): FieldValue
    {

        // Retrieve the existing resolver function
        /** @var Closure $previousResolver */
        $previousResolver = $fieldValue->getResolver();

        // Wrap around the resolver
        $wrappedResolver = function ($root, array $args, GraphQLContext $context, ResolveInfo $info) use ($previousResolver): string {
            // Call the resolver, passing along the resolver arguments
            /** @var string $result */
            $result = $previousResolver($root, $args, $context, $info);
            return ($result);
        };

        // Place the wrapped resolver back upon the FieldValue
        // It is not resolved right now - we just prepare it
        $fieldValue->setResolver($wrappedResolver);

        // Keep the middleware chain going
        return $next($fieldValue);
    }

}

как мне получить значение ключа " текст "из моей директивы и добавить к $ result [@append (text:", пожалуйста. ")]. $ Args - это пустой массив (и это должно быть потому, что я сделал параметризованный запрос [sayFriendly])

1 Ответ

1 голос
/ 20 апреля 2020

Если вы расширите свою директиву с Nuwave\Lighthouse\Schema\Directives\BaseDirective, у вас будет доступ к $this->directiveArgValue('text'); для получения текстового аргумента к вашей пользовательской директиве.

$args пустые, потому что это аргументы, предоставленные клиент в запросе, в примере запроса sayFriendly нет возможных аргументов, поэтому он всегда будет пустым.

В качестве подсказки: вы можете узнать это, посмотрев на уже реализованные директивы внутри Lighthouse, документация по пользовательским директивам немного тонкая, но вы можете многое узнать, взглянув на директивы, предоставленные Lighthouse.

...