Funções PHP via Schema
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"
}
]
}
}