Задать вопрос
  • Как в Apollo (GraphQL) менять урл запроса (эндпоинта)?

    @MrPofix Автор вопроса
    В общем, решения по моему вопросу так и не нашёл. Кто задался таким же вопросом - рассказываю, как решил задачу.

    Я использую библиотеку https://github.com/rebing/graphql-laravel
    В конфигах есть настройка схем, ну я и настроил изначально общие роуты под default, приватные - под auth:
    'schemas' => [
            'default' => [
                'query' => [
                    \App\Http\GraphQL\Queries\UserQuery::class,              
                ],
                'mutation' => [
                    'createUser' => \App\Http\GraphQL\Mutations\CreateUserMutation::class,              
                ],
                'middleware' => [ ],
                'method' => ['get', 'post'],
            ],
    
            'auth' => [
                'query' => [
                    \App\Http\GraphQL\Queries\GetMyProfileQuery::class,              
                ],
                'mutation' => [],
                'middleware' => [
                    'api'
                ],
                'method' => [ 'post'],
            ],
        ],


    В итоге перенёс все роуты в блок default:
    'schemas' => [
            'default' => [
                'query' => [
                    \App\Http\GraphQL\Queries\UserQuery::class,             
                     \App\Http\GraphQL\Queries\GetMyProfileQuery::class,              
                ],
                'mutation' => [
                    'createUser' => \App\Http\GraphQL\Mutations\CreateUserMutation::class,              
                ],
                'middleware' => ['jwtAuth' ],
                'method' => ['get', 'post'],
            ],
        ],


    Сделал Middleware (jwtAuth), который по JWT токену пытается авторизовать юзера (если токен передан - авторизует).

    Для приватных роутов сделал базовый класс с проверкой на авторизацию (соответственно, все приватные контроллеры наследую от него):

    abstract class _BaseQuery extends Query
    {
        public function authorize(
            $root,
            array $args,
            $ctx,
            ResolveInfo $resolveInfo = null,
            Closure $getSelectFields = null
        ): bool {
            return Auth::check();
        }
    }


    Таким образом, задача решена. Но чувство прекрасного страдает, так как мне не нравится такое решение )
    Если нет возможность менять УРЛ запроса, то к чему настройки схемы в rebing/graphql-laravel...

    UPD. Спустя несколько дней разработки, случайно наткнулся на решение:
    import { ApolloClient, HttpLink, InMemoryCache } from "@apollo/client";
    import { RetryLink } from "@apollo/client/link/retry";
    
    const directionalLink = new RetryLink().split(
      (operation) => operation.getContext().version === 1,
      new HttpLink({ uri: "http://localhost:4000/v1/graphql" }),
      new HttpLink({ uri: "http://localhost:4000/v2/graphql" })
    );
    
    const client = new ApolloClient({
      cache: new InMemoryCache(),
      link: directionalLink,
    });

    https://www.apollographql.com/docs/react/data/erro...
    Ответ написан
    Комментировать