Funções do schema
Funções do schemaFunções PHP via Schema

Funções PHP via Schema

Included in the “Power Extensions” bundle

Esta extensão adiciona campos e directives ao schema GraphQL que expõem funcionalidades comumente encontradas em linguagens de programação (como PHP).

Descrição

Os campos e directives de função são úteis para manipular os dados após serem recuperados, permitindo transformar o valor de um campo da forma desejada e concedendo poderosas capacidades de importação/exportação de dados.

Esta query, contendo uma variedade de campos e directives de função:

{
  _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"]
    )
}

...produz:

{
  "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"
    }
  }
}

Campos de Função

Os campos de função são Campos Globais, portanto são adicionados a cada tipo no schema GraphQL: em QueryRoot, mas também em Post, User, etc.

Esta é a lista dos campos de função.

_and

Retorna uma operação AND entre diversas propriedades booleanas.

_arrayAddItem

Adiciona um elemento ao array.

_arrayCombine

Cria um objeto JSON usando os elementos de um array como chaves e os elementos de outro array como valores.

_arrayChunk

Divide um array em partes.

_arrayDiff

Retorna um array contendo todos os elementos do primeiro array que não estão presentes em nenhum dos outros arrays.

_arrayEncodeAsJSONString

Codifica um array como uma string JSON.

_arrayFill

Cria um array preenchido com valores.

_arrayFilter

Filtra os elementos nulos ou vazios do array.

_arrayFlipToObject

Troca todas as chaves numéricas pelos seus valores associados em um array, retornando um objeto.

_arrayInnerJoinJSONObjectProperties

Preenche os objetos JSON dentro de um array de destino com propriedades de um objeto JSON de um array de origem, onde uma determinada propriedade é igual em ambos os objetos.

_arrayItem

Acessa o elemento na posição indicada do array.

_arrayJoin

Une todas as strings de um array, usando um separador fornecido.

_arrayKeys

Chaves de um array.

_arrayLength

Número de elementos em um array.

_arrayMerge

Une dois ou mais arrays.

_arrayPad

Preenche um array até o comprimento especificado com um valor.

_arrayRandom

Seleciona aleatoriamente um elemento entre os fornecidos.

_arrayRemoveFirst

Remove o primeiro elemento do array.

_arrayRemoveLast

Remove o último elemento do array.

_arrayReverse

Inverte um array.

_arraySearch

Busca em qual posição um elemento está no array. Se encontrado, retorna sua posição; caso contrário, retorna false.

_arraySetItem

Define um elemento em uma determinada posição do array.

_arraySlice

Extrai uma fatia de um array.

_arraySplice

Remove uma parte de um array e a substitui por outra coisa.

_arrayUnique

Filtra todos os elementos duplicados do array.

_date

Retorna uma string formatada de acordo com a string de formato fornecida, usando o timestamp inteiro indicado (timestamp Unix) ou a hora atual se nenhum timestamp for fornecido. Em outras palavras, timestamp é opcional e tem como padrão o valor de time() (fornecido pelo campo _time).

_echo

Repete o valor de entrada, seja ele qual for.

_equals

Indica se o resultado de um campo é igual a um determinado valor.

_floatCeil

Arredonda um número para o inteiro superior mais próximo.

_floatDivide

Divide um número por outro número.

_greaterThan

Indica se número1 > número2.

_greaterThanOrEquals

Indica se número1 >= número2.

_if

Se uma propriedade booleana for verdadeira, executa um campo; caso contrário, executa outro campo.

_inArray

Indica se o array contém o valor.

_intAdd

Adiciona um inteiro a outro número inteiro.

_intArraySum

Soma dos elementos inteiros do array.

_intMultiply

Multiplica um inteiro por outro número inteiro.

_intSubtract

Subtrai um inteiro de outro número inteiro.

_isEmpty

Indica se um valor está vazio.

_isNull

Indica se um valor é nulo.

_lowerThan

Indica se número1 < número2.

_lowerThanOrEquals

Indica se número1 <= número2.

_makeTime

Retorna o timestamp Unix correspondente aos argumentos fornecidos. Esse timestamp é um inteiro longo contendo o número de segundos entre a Época Unix (1 de janeiro de 1970 00:00:00 GMT) e o horário especificado.

Qualquer argumento opcional omitido ou nulo será definido com o valor atual de acordo com a data e hora locais.

_not

Retorna o valor oposto de uma propriedade booleana.

_notEmpty

Indica se o valor não está vazio.

_notEquals

Indica se os dois valores não são iguais entre si.

_notInArray

Indica se o array não contém o valor.

_notNull

Indica se o valor não é null.

_objectAddEntry

Adiciona uma entrada ao objeto.

_objectEncodeAsJSONString

Codifica um objeto como uma string JSON.

_objectFilter

Filtra os elementos nulos ou vazios do objeto.

_objectFlip

Inverte as chaves e os valores de um objeto JSON.

_objectIntersectKey

Calcula a interseção de objetos usando chaves para comparação.

_objectKeepProperties

Mantém apenas propriedades específicas no objeto JSON.

_objectMerge

Une dois ou mais objetos.

_objectProperties

Recupera as propriedades de um objeto JSON.

_objectProperty

Recupera uma propriedade de um objeto JSON.

_objectRemoveEntry

Remove uma entrada do objeto JSON.

_objectRemoveProperties

Remove uma ou mais entradas do objeto JSON.

_objectValues

Recupera os valores de um objeto JSON.

_or

Retorna uma operação OR entre diversas propriedades booleanas.

_propertyExistsInJSONObject

Indica se uma propriedade existe em um objeto JSON.

_propertyIsSetInJSONObject

Indica se uma propriedade existe e não é null em um objeto JSON.

_sprintf

Substitui placeholders dentro de uma string pelos valores fornecidos.

_strAppend

Acrescenta uma string a outra string.

_strArrayReplace

Substitui uma string por outra string em um array.

_strArrayReplaceMultiple

Substitui uma lista de strings por outra lista de strings em um array.

_strContains

Indica se uma string contém outra string.

_strDecodeJSONObject

Decodifica uma string em um objeto JSON, ou retorna null se não for possível.

_strDecodeList

Decodifica uma string em um array (de qualquer tipo), ou retorna null se não for possível.

_strEndsWith

Indica se uma string termina com outra string.

_strLength

Comprimento da string.

_strLowerCase

Transforma uma string em letras minúsculas.

_strPad

Preenche uma string até um determinado comprimento com outra string.

_strPos

Posição de uma substring dentro da string, ou null se não encontrada.

_strRegexFindMatches

Executa uma expressão regular para extrair todas as correspondências de uma string.

_strRegexReplace

Executa uma expressão regular para buscar e substituir uma string.

_strRegexReplaceMultiple

Executa expressões regulares para buscar e substituir strings.

_strRepeat

Repete uma string.

_strReplace

Substitui uma string por outra string.

_strReplaceMultiple

Substitui uma lista de strings por outra lista de strings.

_strReverse

Inverte uma string.

_strShuffle

Embaralha aleatoriamente uma string.

_strStartsWith

Indica se uma string começa com outra string.

_strStripSlashes

Retorna uma string com as barras invertidas removidas. (\' se torna ' e assim por diante.) Barras invertidas duplas (\\) se tornam uma única barra invertida (\).

_strSubstr

Retorna parte de uma string.

_strTitleCase

Transforma uma string para o formato title case.

_strToTime

Converte praticamente qualquer descrição textual de data e hora em inglês em um timestamp Unix.

_strTrim

Remove espaços em branco (ou outros caracteres) do início e do final de uma string.

_strUpperCase

Transforma uma string em letras maiúsculas.

_strWordCount

Número de palavras na string.

_time

Retorna a hora atual.

Directives de Função

Esta é a lista das directives de função.

@arrayAddItem

Adiciona um elemento ao array.

@arrayDiff

Calcula a diferença em relação a outro array.

@arrayFilter

Filtra os elementos nulos ou vazios do array.

@arrayMerge

Une o array com outro array.

@arrayPad

Preenche um array até o comprimento especificado com um valor.

@arrayRemoveFirst

Remove o primeiro elemento do array.

@arrayRemoveLast

Remove o último elemento do array.

@arrayReverse

Inverte um array.

@arraySetItem

Define um elemento em uma determinada posição do array.

@arraySlice

Extrai uma fatia de um array.

@arraySplice

Remove uma parte de um array e a substitui por outra coisa.

@arrayUnique

Filtra todos os elementos duplicados do array.

@boolOpposite

Converte um booleano para seu valor oposto.

@floatDivide

Divide o valor do campo por um número de ponto flutuante.

@intAdd

Adiciona um número inteiro ao valor do campo.

@intMultiply

Multiplica um número inteiro pelo valor do campo.

@intSubtract

Subtrai um número inteiro do valor do campo.

@objectAddEntry

Adiciona uma entrada ao objeto JSON.

@objectFilter

Filtra os elementos nulos ou vazios de um objeto.

@objectKeepProperties

Mantém apenas propriedades específicas do objeto JSON.

@objectRemoveEntry

Remove uma entrada do objeto JSON.

@objectRemoveProperties

Remove propriedades específicas do objeto JSON.

@setNull

Define o valor do campo como null.

@strAppend

Acrescenta uma string ao final da string no valor do campo.

@strLowerCase

Converte uma string para letras minúsculas.

@strPad

Preenche uma string até um determinado comprimento com outra string.

@strPrepend

Acrescenta uma string ao início da string no valor do campo.

@strRegexReplace

Executa uma expressão regular para buscar e substituir uma string (veja a documentação da função PHP preg_replace).

@strRegexReplaceMultiple

Executa expressões regulares para buscar e substituir uma lista de strings (veja a documentação da função PHP preg_replace).

@strRepeat

Repete uma string.

@strReplace

Substitui uma string por outra string.

@strReplaceMultiple

Substitui uma lista de strings por outra lista de strings.

@strReverse

Inverte uma string.

@strShuffle

Embaralha aleatoriamente uma string.

@strStripSlashes

Retorna uma string com as barras invertidas removidas. (\' se torna ' e assim por diante.) Barras invertidas duplas (\\) se tornam uma única barra invertida.

@strSubstr

Retorna parte de uma string.

@strTitleCase

Converte uma string para o formato title case.

@strTrim

Remove espaços em branco (ou outros caracteres) do início e do final de uma string.

@strUpperCase

Converte uma string para letras maiúsculas.

Exemplos

Campos de Função

Embora tenhamos um campo Post.hasComments, pode ser necessário o valor oposto. Em vez de criar um novo campo Post.notHasComments (para o qual seria necessário editar código PHP), podemos usar o recurso Field to Input para passar o valor de hasComments como entrada para um campo not, calculando assim o novo valor sempre dentro da query GraphQL:

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

Podemos aplicar campos de função várias vezes para realizar um cálculo mais complexo, como gerar um campo summary baseado nos valores de outros campos:

{
  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
    )
  }
}

Em combinação com a extensão HTTP Client, podemos gerar dinamicamente um endpoint de API para se conectar (com base nos dados do nosso site) e, em seguida, extrair um campo específico dos dados retornados:

{
  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"
      }
    )
  }
}

...produzindo:

{
  "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"
      }
    ]
  }
}

Directives de Função

Se esta query:

query {
  posts {
    title
  }
}

...produz estes resultados:

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

...então esta query:

query {
  posts {
    title @strUpperCase
  }
}

...produzirá:

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