Konfigurowanie schematu
Konfigurowanie schematuUżywanie dyrektyw kompozycyjnych

Używanie dyrektyw kompozycyjnych

Spraw, aby dyrektywa modyfikowała zachowanie innej dyrektywy.

Ta funkcjonalność pozwala używać dyrektywy w sytuacjach, gdy w innym przypadku nie byłoby to możliwe ze względu na niezgodność typów (tzn. gdy dyrektywa nie może zostać zastosowana do pola, ponieważ jej wejście różni się od wyjścia pola).

Na przykład pole capabilities zwraca [String] (tablicę ciągów znaków), a dyrektywa @strUpperCase przyjmuje String. Dlatego wykonanie poniższego query zwraca błąd z powodu niezgodności typów:

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

Dzięki dyrektywom kompozycyjnym możemy zastosować dyrektywę @underEachArrayItem (która iteruje po tablicy elementów i stosuje swoją zagnieżdżoną dyrektywę do każdego z nich), aby przygotować grunt przed wykonaniem @strUpperCase, sprawiając że otrzymuje ona pojedynczy element (typu String).

Powyższe query można zrealizować w następujący sposób:

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

Meta-dyrektywy

Każda meta-dyrektywa może wpływać (lub „zagnieżdżać") wiele dyrektyw jednocześnie. Dyrektywy, na które ma wpływ, są wskazywane za pomocą argumentu affectDirectivesUnderPos, który przyjmuje tablicę dodatnich liczb całkowitych, z których każda określa względną pozycję danej dyrektywy.

Domyślnie argument affectDirectivesUnderPos ma wartość domyślną [1], co oznacza, że będzie wpływał na dyrektywę znajdującą się bezpośrednio obok.

W poniższym przykładzie mamy:

  • @underEachArrayItem jest meta-dyrektywą
  • @strTranslate jest zagnieżdżona pod @underEachArrayItem (niejawna wartość domyślna affectDirectivesUnderPos: [1])
{
  someField
    @underEachArrayItem
      @strTranslate
}

W poniższym przykładzie mamy natomiast:

  • @strTranslate i @strUpperCase są zagnieżdżone pod @underEachArrayItem (jak wskazują względne pozycje [1, 2] w argumencie affectDirectivesUnderPos)
{
  someField
    @underEachArrayItem(affectDirectivesUnderPos: [1, 2])
      @strTranslate
      @strUpperCase
}

Meta-dyrektywy mogą być również zagnieżdżane wewnątrz innych meta-dyrektyw.

W poniższym przykładzie mamy:

  • @underEachArrayItem jest najbardziej zewnętrzną meta-dyrektywą
  • @underJSONObjectProperty jest zagnieżdżona pod @underEachArrayItem
  • @strUpperCase jest zagnieżdżona pod @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
  }

Konfiguracja

Aby włączyć lub wyłączyć dyrektywy kompozycyjne w schemacie GraphQL, przejdź do modułu "Composable Directives" na stronie Ustawień i zaznacz/odznacz pole wyboru Enable composable directives?:

Ustawienia dla Composable Directives
Ustawienia dla Composable Directives

Aby włączyć lub wyłączyć dyrektywy kompozycyjne w konkretnym endpoincie, wybierz odpowiednią opcję w bloku "Composable Directives" w odpowiedniej Schema Configuration:

Composable Directives w Schema Configuration
Composable Directives w Schema Configuration