Funkcje schematu
Funkcje schematuFunkcje PHP via Schema

Funkcje PHP via Schema

Included in the “Power Extensions” bundle

To rozszerzenie dodaje pola i dyrektywy do schematu GraphQL, które udostępniają funkcjonalności powszechnie spotykane w językach programowania (takich jak PHP).

Opis

Pola i dyrektywy funkcji są przydatne do manipulowania danymi po ich pobraniu, umożliwiając transformację wartości pola w dowolny wymagany sposób i zapewniając potężne możliwości importu/eksportu danych.

Ta query, zawierająca różnorodne pola i dyrektywy funkcji:

{
  _intAdd(add: 15, to: 56)
  _intArraySum(array: [1, 2, 3, 4, 5])
 
  _arrayJoin(array: ["Hello", "to", "everyone"], separator: " ")
  _arrayItem(array: ["one", "two", "three", "four", "five"], position: 3)
  _arraySearch(array: ["uno", "dos", "tres", "cuatro", "cinco"], element: "tres")
  _arrayUnique(array: ["uno", "dos", "uno", "tres", "cuatro", "dos", "cinco", "dos"])
  _arrayMerge(arrays: [["uno", "dos", "uno"], ["tres", "cuatro", "dos", "cinco", "dos"]])
  _arrayDiff(arrays: [["uno", "dos"], ["tres", "cuatro", "dos"]])
  _arrayAddItem(array: ["uno", "dos"], value: "tres")
  _arraySetItem(array: ["uno", "dos"], index: 0, value: "tres")
  _arrayKeys(array: ["uno", "dos", "tres"])
  _arrayLength(array: ["uno", "dos", "tres"])
 
  _strRegexFindMatches(regex: "/https?:\\/\\/([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\\.[a-zA-Z]{2,})/", string: "In website https://gatographql.com there is more information")
  
  _strReplace(search: "https://", replaceWith: "http://", in: "https://gatographql.com")
  _strReplaceMultiple(search: ["https://", "gato"], replaceWith: ["http://", "dog"], in: "https://gatographql.com")
  _strRegexReplace(searchRegex: "/^https?:\\/\\//", replaceWith: "", in: "https://gatographql.com")
  _strRegexReplaceMultiple(searchRegex: ["/^https?:\\/\\//", "/([a-z]*)/"], replaceWith: ["", "$1$1"], in: "https://gatographql.com")
  
  _strStartsWith(search: "orld", in: "Hello world")
  _strEndsWith(search: "orld", in: "Hello world")
  _strUpperCase(text: "Hello world")
  _strLowerCase(text: "Hello world")
  _strTitleCase(text: "Hello world")
 
 
  falseToTrue: _echo(value: false) @boolOpposite
  trueToFalse: _echo(value: true) @boolOpposite
  plusOne: _echo(value: 2) @intAdd(number: 1)
  objectAddEntry: _echo(value: {
    user: "Leo",
    contact: {
      email: "leo@test.com"
    }
  })
    @objectAddEntry(key: "phone", value: "+0929094229", underPath: "contact")
    @objectAddEntry(key: "methods", value: {}, underPath: "contact")
    @objectAddEntry(key: "card", value: true, underPath: "contact.methods")
  upperCase: _echo(value: "Hello world") @strUpperCase
  lowerCase: _echo(value: "Hello world") @strLowerCase
  titleCase: _echo(value: "Hello world") @strTitleCase
  append: _echo(value: "Hello world") @strAppend(string: "!!!")
  prepend: _echo(value: "Hello world") @strPrepend(string: "!!!")
  arraySplice: _echo(value: ["uno", "dos", "tres"]) @arraySplice(offset: 1)
  arraySpliceWithLength: _echo(value: ["uno", "dos", "tres"]) @arraySplice(offset: 1, length: 1)
  arraySpliceWithReplacement: _echo(value: ["uno", "dos", "tres"]) @arraySplice(offset: 1, replacement: ["cuatro", "cinco"])
  arraySpliceWithLengthAndReplacement: _echo(value: ["uno", "dos", "tres"]) @arraySplice(offset: 1, length: 1, replacement: ["cuatro", "cinco"])
  arrayUnique: _echo(value: ["uno", "dos", "uno", "tres", "cuatro", "dos", "cinco", "dos"]) @arrayUnique
  arrayMerge: _echo(value: ["uno", "dos", "uno"]) @arrayMerge(with: ["tres", "cuatro", "dos", "cinco", "dos"])
  arrayDiff: _echo(value: ["uno", "dos"]) @arrayDiff (against: ["tres", "cuatro", "dos"])
  arrayFilter: _echo(value: ["uno", "dos", null, "tres", "", "dos", []]) @arrayFilter
  objectKeepProperties: _echo(value: { user: "Leo", email: "leo@test.com" } )
    @objectKeepProperties(
      keys: ["user"]
    )
}

...daje wynik:

{
  "data": {
    "_intAdd": 71,
    "_intArraySum": 15,
    "_arrayJoin": "Hello to everyone",
    "_arrayItem": "four",
    "_arraySearch": 2,
    "_arrayUnique": [
      "uno",
      "dos",
      "tres",
      "cuatro",
      "cinco"
    ],
    "_arrayMerge": [
      "uno",
      "dos",
      "uno",
      "tres",
      "cuatro",
      "dos",
      "cinco",
      "dos"
    ],
    "_arrayDiff": [
      "uno"
    ],
    "_arrayAddItem": [
      "uno",
      "dos",
      "tres"
    ],
    "_arraySetItem": [
      "tres",
      "dos"
    ],
    "_arrayKeys": [
      0,
      1,
      2
    ],
    "_arrayLength": 3,
    "_strRegexFindMatches": [
      [
        "https:\/\/gatographql.com"
      ],
      [
        "gatographql.com"
      ]
    ],
    "_strReplace": "http://gatographql.com",
    "_strReplaceMultiple": "http://doggraphql.com",
    "_strRegexReplace": "gatographql.com",
    "_strRegexReplaceMultiple": "gatographqlgatographql.comcom",
    "_strStartsWith": false,
    "_strEndsWith": true,
    "_strUpperCase": "HELLO WORLD",
    "_strLowerCase": "hello world",
    "_strTitleCase": "Hello World",
    "falseToTrue": true,
    "trueToFalse": false,
    "plusOne": 3,
    "objectAddEntry": {
      "user": "Leo",
      "contact": {
        "email": "leo@test.com",
        "phone": "+0929094229",
        "methods": {
          "card": true
        }
      }
    },
    "upperCase": "HELLO WORLD",
    "lowerCase": "hello world",
    "titleCase": "Hello World",
    "append": "Hello world!!!",
    "prepend": "!!!Hello world",
    "arraySplice": [
      "uno"
    ],
    "arraySpliceWithLength": [
      "uno",
      "tres"
    ],
    "arraySpliceWithReplacement": [
      "uno",
      "cuatro",
      "cinco"
    ],
    "arraySpliceWithLengthAndReplacement": [
      "uno",
      "cuatro",
      "cinco",
      "tres"
    ],
    "arrayUnique": [
      "uno",
      "dos",
      "tres",
      "cuatro",
      "cinco"
    ],
    "arrayMerge": [
      "uno",
      "dos",
      "uno",
      "tres",
      "cuatro",
      "dos",
      "cinco",
      "dos"
    ],
    "arrayDiff": [
      "uno"
    ],
    "arrayFilter": [
      "uno",
      "dos",
      "tres",
      "dos"
    ],
    "objectKeepProperties": {
      "user": "Leo"
    }
  }
}

Pola Funkcji

Pola funkcji są Polami Globalnymi, dlatego są dodawane do każdego typu w schemacie GraphQL: w QueryRoot, ale także w Post, User itd.

Poniżej znajduje się lista pól funkcji.

_and

Zwraca wynik operacji AND na kilku właściwościach logicznych.

_arrayAddItem

Dodaje element do tablicy.

_arrayCombine

Tworzy obiekt JSON używając elementów jednej tablicy jako kluczy i elementów innej tablicy jako wartości.

_arrayChunk

Dzieli tablicę na fragmenty.

_arrayDiff

Zwraca tablicę zawierającą wszystkie elementy z pierwszej tablicy, które nie są obecne w żadnej z pozostałych tablic.

_arrayEncodeAsJSONString

Koduje tablicę jako ciąg JSON.

_arrayFill

Tworzy tablicę wypełnioną wartościami.

_arrayFilter

Usuwa elementy null lub puste z tablicy.

_arrayFlipToObject

Zamienia wszystkie klucze numeryczne na powiązane z nimi wartości w tablicy, zwracając obiekt.

_arrayInnerJoinJSONObjectProperties

Wypełnia obiekty JSON wewnątrz tablicy docelowej właściwościami z obiektu JSON tablicy źródłowej, gdzie określona właściwość jest taka sama dla obu obiektów.

_arrayItem

Uzyskuje dostęp do elementu na podanej pozycji w tablicy.

_arrayJoin

Łączy wszystkie ciągi znaków z tablicy, używając podanego separatora.

_arrayKeys

Klucze tablicy.

_arrayLength

Liczba elementów w tablicy.

_arrayMerge

Scala dwie lub więcej tablic razem.

_arrayPad

Uzupełnia tablicę do określonej długości wartością.

_arrayRandom

Losowo wybiera jeden element z podanych.

_arrayRemoveFirst

Usuwa pierwszy element tablicy.

_arrayRemoveLast

Usuwa ostatni element tablicy.

_arrayReverse

Odwraca tablicę.

_arraySearch

Wyszukuje pozycję elementu w tablicy. Jeśli zostanie znaleziony, zwraca jego pozycję, w przeciwnym razie zwraca false.

_arraySetItem

Ustawia element na danej pozycji tablicy.

_arraySlice

Wyodrębnia wycinek tablicy.

_arraySplice

Usuwa fragment tablicy i zastępuje go czymś innym.

_arrayUnique

Usuwa wszystkie zduplikowane elementy z tablicy.

_date

Zwraca ciąg znaków sformatowany zgodnie z podanym formatem, używając podanego całkowitego timestamp (znacznika czasu Unix) lub bieżącego czasu, jeśli nie podano znacznika czasu. Innymi słowy, timestamp jest opcjonalny i domyślnie przyjmuje wartość time() (dostarczaną przez pole _time).

_echo

Powtarza dane wejściowe, niezależnie od ich rodzaju.

_equals

Wskazuje, czy wynik pola jest równy określonej wartości.

_floatCeil

Zaokrągla liczbę w górę do najbliższej wyższej liczby całkowitej.

_floatDivide

Dzieli liczbę przez inną liczbę.

_greaterThan

Wskazuje, czy liczba1 > liczba2.

_greaterThanOrEquals

Wskazuje, czy liczba1 >= liczba2.

_if

Jeśli właściwość logiczna jest prawdziwa, wykonuje jedno pole; w przeciwnym razie wykonuje inne pole.

_inArray

Wskazuje, czy tablica zawiera daną wartość.

_intAdd

Dodaje liczbę całkowitą do innej liczby całkowitej.

_intArraySum

Suma całkowitych elementów tablicy.

_intMultiply

Mnoży liczbę całkowitą przez inną liczbę całkowitą.

_intSubtract

Odejmuje liczbę całkowitą od innej liczby całkowitej.

_isEmpty

Wskazuje, czy wartość jest pusta.

_isNull

Wskazuje, czy wartość jest null.

_lowerThan

Wskazuje, czy liczba1 < liczba2.

_lowerThanOrEquals

Wskazuje, czy liczba1 <= liczba2.

_makeTime

Zwraca znacznik czasu Unix odpowiadający podanym argumentom. Ten znacznik czasu to długa liczba całkowita zawierająca liczbę sekund między Epoką Unix (1 stycznia 1970 00:00:00 GMT) a podanym czasem.

Wszelkie pominięte lub null opcjonalne argumenty zostaną ustawione na bieżącą wartość zgodnie z lokalną datą i godziną.

_not

Zwraca przeciwną wartość właściwości logicznej.

_notEmpty

Wskazuje, czy wartość nie jest pusta.

_notEquals

Wskazuje, czy dwie wartości nie są sobie równe.

_notInArray

Wskazuje, czy tablica nie zawiera danej wartości.

_notNull

Wskazuje, czy wartość nie jest null.

_objectAddEntry

Dodaje wpis do obiektu.

_objectEncodeAsJSONString

Koduje obiekt jako ciąg JSON.

_objectFilter

Usuwa elementy null lub puste z obiektu.

_objectFlip

Odwraca klucze i wartości w obiekcie JSON.

_objectIntersectKey

Oblicza część wspólną obiektów używając kluczy do porównania.

_objectKeepProperties

Zachowuje tylko określone właściwości w obiekcie JSON.

_objectMerge

Scala dwa lub więcej obiektów razem.

_objectProperties

Pobiera właściwości obiektu JSON.

_objectProperty

Pobiera właściwość z obiektu JSON.

_objectRemoveEntry

Usuwa wpis z obiektu JSON.

_objectRemoveProperties

Usuwa jeden lub więcej wpisów z obiektu JSON.

_objectValues

Pobiera wartości z obiektu JSON.

_or

Zwraca wynik operacji OR na kilku właściwościach logicznych.

_propertyExistsInJSONObject

Wskazuje, czy właściwość istnieje w obiekcie JSON.

_propertyIsSetInJSONObject

Wskazuje, czy właściwość istnieje i nie jest null w obiekcie JSON.

_sprintf

Zastępuje symbole zastępcze w ciągu znaków podanymi wartościami.

_strAppend

Dołącza ciąg znaków do innego ciągu.

_strArrayReplace

Zastępuje ciąg znaków innym ciągiem w tablicy.

_strArrayReplaceMultiple

Zastępuje listę ciągów znaków inną listą ciągów w tablicy.

_strContains

Wskazuje, czy ciąg znaków zawiera inny ciąg.

_strDecodeJSONObject

Dekoduje ciąg znaków do obiektu JSON lub zwraca null, jeśli jest to niemożliwe.

_strDecodeList

Dekoduje ciąg znaków do tablicy (dowolnego typu) lub zwraca null, jeśli jest to niemożliwe.

_strEndsWith

Wskazuje, czy ciąg znaków kończy się innym ciągiem.

_strLength

Długość ciągu znaków.

_strLowerCase

Przekształca ciąg znaków na małe litery.

_strPad

Uzupełnia ciąg znaków do określonej długości innym ciągiem.

_strPos

Pozycja podciągu w ciągu znaków lub null, jeśli nie znaleziono.

_strRegexFindMatches

Wykonuje wyrażenie regularne w celu wyodrębnienia wszystkich dopasowań z ciągu znaków.

_strRegexReplace

Wykonuje wyrażenie regularne w celu wyszukania i zastąpienia ciągu znaków.

_strRegexReplaceMultiple

Wykonuje wyrażenia regularne w celu wyszukania i zastąpienia ciągów znaków.

_strRepeat

Powtarza ciąg znaków.

_strReplace

Zastępuje ciąg znaków innym ciągiem.

_strReplaceMultiple

Zastępuje listę ciągów znaków inną listą ciągów.

_strReverse

Odwraca ciąg znaków.

_strShuffle

Losowo przetasowuje ciąg znaków.

_strStartsWith

Wskazuje, czy ciąg znaków zaczyna się od innego ciągu.

_strStripSlashes

Zwraca ciąg znaków z usuniętymi ukośnikami odwrotnymi. (\' staje się ' itd.) Podwójne ukośniki odwrotne (\\) stają się pojedynczym ukośnikiem odwrotnym (\).

_strSubstr

Zwraca część ciągu znaków.

_strTitleCase

Przekształca ciąg znaków do formatu title case.

_strToTime

Przetwarza prawie dowolny tekstowy opis daty i czasu w języku angielskim na znacznik czasu Unix.

_strTrim

Usuwa białe znaki (lub inne znaki) z początku i końca ciągu znaków.

_strUpperCase

Przekształca ciąg znaków na wielkie litery.

_strWordCount

Liczba słów w ciągu znaków.

_time

Zwraca bieżący czas.

Dyrektywy Funkcji

Poniżej znajduje się lista dyrektyw funkcji.

@arrayAddItem

Dodaje element do tablicy.

@arrayDiff

Oblicza różnicę z inną tablicą.

@arrayFilter

Usuwa elementy null lub puste z tablicy.

@arrayMerge

Scala tablicę z inną tablicą.

@arrayPad

Uzupełnia tablicę do określonej długości wartością.

@arrayRemoveFirst

Usuwa pierwszy element tablicy.

@arrayRemoveLast

Usuwa ostatni element tablicy.

@arrayReverse

Odwraca tablicę.

@arraySetItem

Ustawia element na danej pozycji tablicy.

@arraySlice

Wyodrębnia wycinek tablicy.

@arraySplice

Usuwa fragment tablicy i zastępuje go czymś innym.

@arrayUnique

Usuwa wszystkie zduplikowane elementy z tablicy.

@boolOpposite

Konwertuje wartość logiczną na jej przeciwieństwo.

@floatDivide

Dzieli wartość pola przez liczbę zmiennoprzecinkową.

@intAdd

Dodaje liczbę całkowitą do wartości pola.

@intMultiply

Mnoży liczbę całkowitą przez wartość pola.

@intSubtract

Odejmuje liczbę całkowitą od wartości pola.

@objectAddEntry

Dodaje wpis do obiektu JSON.

@objectFilter

Usuwa elementy null lub puste z obiektu.

@objectKeepProperties

Zachowuje tylko określone właściwości z obiektu JSON.

@objectRemoveEntry

Usuwa wpis z obiektu JSON.

@objectRemoveProperties

Usuwa określone właściwości z obiektu JSON.

@setNull

Ustawia wartość pola jako null.

@strAppend

Dołącza ciąg znaków na końcu ciągu w wartości pola.

@strLowerCase

Konwertuje ciąg znaków na małe litery.

@strPad

Uzupełnia ciąg znaków do określonej długości innym ciągiem.

@strPrepend

Dołącza ciąg znaków na początku ciągu w wartości pola.

@strRegexReplace

Wykonuje wyrażenie regularne w celu wyszukania i zastąpienia ciągu znaków (zob. dokumentacja funkcji PHP preg_replace).

@strRegexReplaceMultiple

Wykonuje wyrażenia regularne w celu wyszukania i zastąpienia listy ciągów znaków (zob. dokumentacja funkcji PHP preg_replace).

@strRepeat

Powtarza ciąg znaków.

@strReplace

Zastępuje ciąg znaków innym ciągiem.

@strReplaceMultiple

Zastępuje listę ciągów znaków inną listą ciągów.

@strReverse

Odwraca ciąg znaków.

@strShuffle

Losowo przetasowuje ciąg znaków.

@strStripSlashes

Zwraca ciąg znaków z usuniętymi ukośnikami odwrotnymi. (\' staje się ' itd.) Podwójne ukośniki odwrotne (\\) stają się pojedynczym ukośnikiem odwrotnym.

@strSubstr

Zwraca część ciągu znaków.

@strTitleCase

Konwertuje ciąg znaków do formatu title case.

@strTrim

Usuwa białe znaki (lub inne znaki) z początku i końca ciągu znaków.

@strUpperCase

Konwertuje ciąg znaków na wielkie litery.

Przykłady

Pola Funkcji

Choć mamy pole Post.hasComments, może być potrzebna wartość przeciwna. Zamiast tworzyć nowe pole Post.notHasComments (co wymagałoby edycji kodu PHP), możemy użyć funkcji Field to Input, aby przekazać wartość z hasComments jako dane wejściowe do pola not, obliczając w ten sposób nową wartość zawsze w ramach query GraphQL:

{
  posts {
    id
    hasComments
    notHasComments: _not(value: $__hasComments)
  }
}

Możemy stosować pola funkcji wielokrotnie, aby wykonać bardziej złożone obliczenia, takie jak generowanie pola summary na podstawie wartości z innych pól:

{
  posts {
    id
    content @remove
    shortContent: _strSubstr(string: $__content, offset: 0, length: 150) @remove
    excerpt @remove
    isExcerptEmpty: _isEmpty(value: $__excerpt) @remove
    summary: _if(
      condition: $__isExcerptEmpty
      then: $__content
      else: $__excerpt
    )
  }
}

W połączeniu z rozszerzeniem HTTP Client możemy dynamicznie generować endpoint API do połączenia (na podstawie danych z naszej witryny), a następnie wyodrębnić określone pole ze zwróconych danych:

{
  users(
    pagination: { limit: 2 },
    sort: { order: ASC, by: ID }
  ) {
    id
    
    # Dynamically generate endpoint for the user
    endpoint: _arrayJoin(values: [
      "https://newapi.getpop.org/wp-json/wp/v2/users/",
      $__id,
      "?_fields=name,avatar_urls"
    ])
    
    # Retrieve the endpoint data
    endpointData: _sendJSONObjectItemHTTPRequest(input: { url: $__endpoint } )
 
    # Extract specific information
    userAvatar: _objectProperty(
      object: $__endpointData,
      by: {
        path: "avatar_urls.48"
      }
    )
  }
}

...dając wynik:

{
  "data": {
    "users": [
      {
        "id": 1,
        "endpoint": "https://newapi.getpop.org/wp-json/wp/v2/users/1?_fields=name,avatar_urls",
        "endpointData": {
          "name": "leo",
          "avatar_urls": {
            "24": "https://secure.gravatar.com/avatar/b28085726ee66e49f08be16ad668efd5?s=24&d=mm&r=g",
            "48": "https://secure.gravatar.com/avatar/b28085726ee66e49f08be16ad668efd5?s=48&d=mm&r=g",
            "96": "https://secure.gravatar.com/avatar/b28085726ee66e49f08be16ad668efd5?s=96&d=mm&r=g"
          },
          "_links": {
            "self": [
              {
                "href": "https://newapi.getpop.org/wp-json/wp/v2/users/1"
              }
            ],
            "collection": [
              {
                "href": "https://newapi.getpop.org/wp-json/wp/v2/users"
              }
            ]
          }
        },
        "userAvatar": "https://secure.gravatar.com/avatar/b28085726ee66e49f08be16ad668efd5?s=48&d=mm&r=g"
      },
      {
        "id": 2,
        "endpoint": "https://newapi.getpop.org/wp-json/wp/v2/users/2?_fields=name,avatar_urls",
        "endpointData": {
          "name": "themedemos",
          "avatar_urls": {
            "24": "https://secure.gravatar.com/avatar/7554514b65216821eeacde0fdcd6c6e6?s=24&d=mm&r=g",
            "48": "https://secure.gravatar.com/avatar/7554514b65216821eeacde0fdcd6c6e6?s=48&d=mm&r=g",
            "96": "https://secure.gravatar.com/avatar/7554514b65216821eeacde0fdcd6c6e6?s=96&d=mm&r=g"
          },
          "_links": {
            "self": [
              {
                "href": "https://newapi.getpop.org/wp-json/wp/v2/users/2"
              }
            ],
            "collection": [
              {
                "href": "https://newapi.getpop.org/wp-json/wp/v2/users"
              }
            ]
          }
        },
        "userAvatar": "https://secure.gravatar.com/avatar/7554514b65216821eeacde0fdcd6c6e6?s=48&d=mm&r=g"
      }
    ]
  }
}

Dyrektywy Funkcji

Jeśli ta query:

query {
  posts {
    title
  }
}

...daje te wyniki:

{
  "data": {
    "posts": [
      {
        "title": "Hello world!"
      },
      {
        "title": "lovely weather"
      }
    ]
  }
}

...to ta query:

query {
  posts {
    title @strUpperCase
  }
}

...da wynik:

{
  "data": {
    "posts": [
      {
        "title": "HELLO WORLD!"
      },
      {
        "title": "LOVELY WEATHER"
      }
    ]
  }
}