PHP Functions via Schema
Это расширение добавляет поля и директивы в схему GraphQL, которые открывают возможности, широко встречающиеся в языках программирования (таких как PHP).
Описание
Поля-функции и директивы-функции полезны для обработки данных после их получения: они позволяют преобразовывать значение поля любым необходимым способом и предоставляют мощные возможности импорта/экспорта данных.
Следующий запрос, содержащий разнообразные поля-функции и директивы-функции:
{
_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"]
)
}...возвращает:
{
"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"
}
}
}Поля-функции
Поля-функции являются глобальными полями, поэтому они добавляются к каждому типу схемы GraphQL: в QueryRoot, а также в Post, User и т.д.
Ниже приведён список полей-функций.
_and
Возвращает результат операции AND над несколькими булевыми свойствами.
_arrayAddItem
Добавляет элемент в массив.
_arrayCombine
Создаёт объект JSON, используя элементы одного массива в качестве ключей и элементы другого массива в качестве значений.
_arrayChunk
Разбивает массив на части.
_arrayDiff
Возвращает массив, содержащий все элементы первого массива, которые отсутствуют в остальных массивах.
_arrayEncodeAsJSONString
Кодирует массив в строку JSON.
_arrayFill
Создаёт массив, заполненный значениями.
_arrayFilter
Фильтрует из массива null-элементы и пустые элементы.
_arrayFlipToObject
Меняет местами все числовые ключи и связанные с ними значения в массиве, возвращая объект.
_arrayInnerJoinJSONObjectProperties
Заполняет JSON-объекты внутри целевого массива свойствами из JSON-объекта исходного массива, в котором определённое свойство одинаково для обоих объектов.
_arrayItem
Обращается к элементу на заданной позиции в массиве.
_arrayJoin
Объединяет все строки в массиве, используя указанный разделитель.
_arrayKeys
Ключи массива.
_arrayLength
Количество элементов в массиве.
_arrayMerge
Объединяет два или более массива.
_arrayPad
Дополняет массив до указанной длины заданным значением.
_arrayRandom
Случайным образом выбирает один элемент из предоставленных.
_arrayRemoveFirst
Удаляет первый элемент массива.
_arrayRemoveLast
Удаляет последний элемент массива.
_arrayReverse
Переворачивает массив.
_arraySearch
Ищет позицию элемента в массиве. Если элемент найден, возвращает его позицию, иначе возвращает false.
_arraySetItem
Устанавливает элемент на указанную позицию в массиве.
_arraySlice
Извлекает срез массива.
_arraySplice
Удаляет часть массива и заменяет её чем-либо другим.
_arrayUnique
Фильтрует все дублирующиеся элементы массива.
_date
Возвращает строку, отформатированную согласно заданной строке формата, используя указанный целочисленный timestamp (Unix-timestamp) или текущее время, если timestamp не задан. Иначе говоря, timestamp является необязательным и по умолчанию принимает значение time() (предоставляемое через поле _time).
_echo
Возвращает входное значение без изменений, каким бы оно ни было.
_equals
Указывает, равен ли результат поля определённому значению.
_floatCeil
Округляет число до следующего наибольшего целого.
_floatDivide
Делит одно число на другое.
_greaterThan
Указывает, выполняется ли условие number1 > number2.
_greaterThanOrEquals
Указывает, выполняется ли условие number1 >= number2.
_if
Если булево свойство истинно, выполняет одно поле, иначе выполняет другое поле.
_inArray
Указывает, содержит ли массив данное значение.
_intAdd
Прибавляет целое число к другому целому числу.
_intArraySum
Сумма целочисленных элементов массива.
_intMultiply
Умножает одно целое число на другое целое число.
_intSubtract
Вычитает одно целое число из другого целого числа.
_isEmpty
Указывает, является ли значение пустым.
_isNull
Указывает, является ли значение null.
_lowerThan
Указывает, выполняется ли условие number1 < number2.
_lowerThanOrEquals
Указывает, выполняется ли условие number1 <= number2.
_makeTime
Возвращает Unix-timestamp, соответствующий переданным аргументам. Этот timestamp — длинное целое число, содержащее количество секунд между Unix Epoch (1 января 1970 года 00:00:00 GMT) и указанным временем.
Любой необязательный аргумент, пропущенный или равный null, будет установлен в текущее значение согласно местной дате и времени.
_not
Возвращает противоположное значение булева свойства.
_notEmpty
Указывает, является ли значение непустым.
_notEquals
Указывает, не равны ли два значения друг другу.
_notInArray
Указывает, не содержит ли массив данное значение.
_notNull
Указывает, не является ли значение null.
_objectAddEntry
Добавляет запись в объект.
_objectEncodeAsJSONString
Кодирует объект в строку JSON.
_objectFilter
Фильтрует из объекта null-элементы и пустые элементы.
_objectFlip
Меняет местами ключи и значения в объекте JSON.
_objectIntersectKey
Вычисляет пересечение объектов, используя ключи для сравнения.
_objectKeepProperties
Оставляет в объекте JSON только указанные свойства.
_objectMerge
Объединяет два или более объекта.
_objectProperties
Извлекает свойства из объекта JSON.
_objectProperty
Извлекает свойство из объекта JSON.
_objectRemoveEntry
Удаляет запись из объекта JSON.
_objectRemoveProperties
Удаляет одну или несколько записей из объекта JSON.
_objectValues
Извлекает значения из объекта JSON.
_or
Возвращает результат операции OR над несколькими булевыми свойствами.
_propertyExistsInJSONObject
Указывает, существует ли свойство в объекте JSON.
_propertyIsSetInJSONObject
Указывает, существует ли свойство в объекте JSON и не является ли оно null.
_sprintf
Заменяет заполнители внутри строки предоставленными значениями.
_strAppend
Добавляет строку к концу другой строки.
_strArrayReplace
Заменяет строку другой строкой в массиве.
_strArrayReplaceMultiple
Заменяет список строк другим списком строк в массиве.
_strContains
Указывает, содержит ли строка другую строку.
_strDecodeJSONObject
Декодирует строку в объект JSON или возвращает null, если это невозможно.
_strDecodeList
Декодирует строку в массив (любого типа) или возвращает null, если это невозможно.
_strEndsWith
Указывает, заканчивается ли строка другой строкой.
_strLength
Длина строки.
_strLowerCase
Преобразует строку в нижний регистр.
_strPad
Дополняет строку до указанной длины другой строкой.
_strPos
Позиция подстроки внутри строки или null, если подстрока не найдена.
_strRegexFindMatches
Выполняет регулярное выражение для извлечения всех совпадений из строки.
_strRegexReplace
Выполняет регулярное выражение для поиска и замены в строке.
_strRegexReplaceMultiple
Выполняет регулярные выражения для поиска и замены в строках.
_strRepeat
Повторяет строку.
_strReplace
Заменяет строку другой строкой.
_strReplaceMultiple
Заменяет список строк другим списком строк.
_strReverse
Переворачивает строку.
_strShuffle
Случайным образом перемешивает строку.
_strStartsWith
Указывает, начинается ли строка с другой строки.
_strStripSlashes
Возвращает строку с удалёнными обратными слешами. (\' становится ' и т.д.) Двойные обратные слеши (\\) превращаются в одиночный обратный слеш (\).
_strSubstr
Возвращает часть строки.
_strTitleCase
Преобразует строку в регистр заголовка.
_strToTime
Разбирает практически любое текстовое описание даты и времени на английском языке в Unix-timestamp.
_strTrim
Удаляет пробельные символы (или другие символы) с начала и конца строки.
_strUpperCase
Преобразует строку в верхний регистр.
_strWordCount
Количество слов в строке.
_time
Возвращает текущее время.
Директивы-функции
Ниже приведён список директив-функций.
@arrayAddItem
Добавляет элемент в массив.
@arrayDiff
Вычисляет разность с другим массивом.
@arrayFilter
Фильтрует из массива null-элементы и пустые элементы.
@arrayMerge
Объединяет массив с другим массивом.
@arrayPad
Дополняет массив до указанной длины заданным значением.
@arrayRemoveFirst
Удаляет первый элемент массива.
@arrayRemoveLast
Удаляет последний элемент массива.
@arrayReverse
Переворачивает массив.
@arraySetItem
Устанавливает элемент на указанную позицию в массиве.
@arraySlice
Извлекает срез массива.
@arraySplice
Удаляет часть массива и заменяет её чем-либо другим.
@arrayUnique
Фильтрует все дублирующиеся элементы массива.
@boolOpposite
Преобразует булево значение в противоположное.
@floatDivide
Делит значение поля на число с плавающей точкой.
@intAdd
Прибавляет целое число к значению поля.
@intMultiply
Умножает целое число на значение поля.
@intSubtract
Вычитает целое число из значения поля.
@objectAddEntry
Добавляет запись в объект JSON.
@objectFilter
Фильтрует из объекта null-элементы и пустые элементы.
@objectKeepProperties
Оставляет в объекте JSON только указанные свойства.
@objectRemoveEntry
Удаляет запись из объекта JSON.
@objectRemoveProperties
Удаляет указанные свойства из объекта JSON.
@setNull
Устанавливает значение поля равным null.
@strAppend
Добавляет строку к концу строки в значении поля.
@strLowerCase
Преобразует строку в нижний регистр.
@strPad
Дополняет строку до указанной длины другой строкой.
@strPrepend
Добавляет строку к началу строки в значении поля.
@strRegexReplace
Выполняет регулярное выражение для поиска и замены в строке (см. документацию по PHP-функции preg_replace).
@strRegexReplaceMultiple
Выполняет регулярные выражения для поиска и замены в списке строк (см. документацию по PHP-функции preg_replace).
@strRepeat
Повторяет строку.
@strReplace
Заменяет строку другой строкой.
@strReplaceMultiple
Заменяет список строк другим списком строк.
@strReverse
Переворачивает строку.
@strShuffle
Случайным образом перемешивает строку.
@strStripSlashes
Возвращает строку с удалёнными обратными слешами. (\' становится ' и т.д.) Двойные обратные слеши (\\) превращаются в одиночный обратный слеш.
@strSubstr
Возвращает часть строки.
@strTitleCase
Преобразует строку в регистр заголовка.
@strTrim
Удаляет пробельные символы (или другие символы) с начала и конца строки.
@strUpperCase
Преобразует строку в верхний регистр.
Примеры
Поля-функции
У нас есть поле Post.hasComments, однако может понадобиться противоположное значение. Вместо того чтобы создавать новое поле Post.notHasComments (для чего пришлось бы редактировать PHP-код), можно воспользоваться функциональностью Field to Input: передать значение hasComments как входные данные в поле not и таким образом вычислить новое значение прямо внутри GraphQL-запроса:
{
posts {
id
hasComments
notHasComments: _not(value: $__hasComments)
}
}Поля-функции можно применять несколько раз для выполнения более сложных вычислений — например, для формирования поля summary на основе значений других полей:
{
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
)
}
}В сочетании с расширением HTTP Client можно динамически генерировать endpoint API для подключения (на основе данных сайта), а затем извлекать конкретное поле из возвращённых данных:
{
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"
}
)
}
}...что возвращает:
{
"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"
}
]
}
}Директивы-функции
Если следующий запрос:
query {
posts {
title
}
}...возвращает такие результаты:
{
"data": {
"posts": [
{
"title": "Hello world!"
},
{
"title": "lovely weather"
}
]
}
}...то этот запрос:
query {
posts {
title @strUpperCase
}
}...вернёт:
{
"data": {
"posts": [
{
"title": "HELLO WORLD!"
},
{
"title": "LOVELY WEATHER"
}
]
}
}