Настройка схемы
Настройка схемыИспользование компонуемых директив

Использование компонуемых директив

Позвольте одной директиве изменять поведение другой директивы.

Эта функциональность позволяет использовать директиву в тех случаях, когда в противном случае мы не смогли бы её применить из-за несоответствия типов (т.е. когда директива не может быть применена к полю, поскольку её входной тип отличается от выходного типа поля).

Например, поле capabilities возвращает [String] (массив строк), а директива @strUpperCase принимает String. Поэтому выполнение следующего запроса возвращает ошибку из-за несоответствия типов:

query {
  user(by: {id: 1}) {
    capabilities @strUpperCase
  }
}

С помощью компонуемых директив мы можем использовать директиву @underEachArrayItem (которая итерирует по массиву элементов и применяет вложенную директиву к каждому из них), чтобы подготовить условия перед выполнением @strUpperCase, заставив её получать одиночный элемент типа String.

Приведённый выше запрос можно выполнить следующим образом:

query {
  user(by: {id: 1}) {
    capabilities
      @underEachArrayItem
        @strUpperCase
  }
}

Мета-директивы

Каждая мета-директива может влиять на (или «вкладывать») несколько директив одновременно. Директивы, на которые оказывается воздействие, указываются через аргумент affectDirectivesUnderPos, который принимает массив положительных целых чисел, каждое из которых определяет относительную позицию затрагиваемой директивы.

По умолчанию аргумент affectDirectivesUnderPos имеет значение [1], что означает воздействие на директиву, стоящую непосредственно рядом.

В приведённом ниже примере:

  • @underEachArrayItem — мета-директива
  • @strTranslate вложена под @underEachArrayItem (неявное значение по умолчанию affectDirectivesUnderPos: [1])
{
  someField
    @underEachArrayItem
      @strTranslate
}

В следующем примере:

  • @strTranslate и @strUpperCase вложены под @underEachArrayItem (как указано относительными позициями [1, 2] в аргументе affectDirectivesUnderPos)
{
  someField
    @underEachArrayItem(affectDirectivesUnderPos: [1, 2])
      @strTranslate
      @strUpperCase
}

Мета-директивы также могут вкладываться внутрь других мета-директив.

В приведённом ниже примере:

  • @underEachArrayItem — верхняя мета-директива
  • @underJSONObjectProperty вложена под @underEachArrayItem
  • @strUpperCase вложена под @underJSONObjectProperty
query UppercaseEntriesInsideObject {
  entries: _echo(value: [
    {
      text: "Hello my friends"
    },
    {
      text: "How do you like this software so far?"
    }
  ])
   @underEachArrayItem
      @underJSONObjectProperty(by: { key: "text" })
        @strUpperCase
  }

Конфигурация

Чтобы включить или отключить компонуемые директивы в схеме GraphQL, перейдите к модулю «Composable Directives» на странице настроек и установите или снимите флажок Enable composable directives?:

Настройки Composable Directives
Настройки Composable Directives

Чтобы включить или отключить компонуемые директивы для конкретного endpoint, выберите нужный параметр в блоке «Composable Directives» соответствующей Schema Configuration:

Composable Directives в Schema Configuration
Composable Directives в Schema Configuration