Schema Functions
Schema FunctionsPHP Functions via Schema

PHP Functions via Schema

Included in the “Power Extensions” bundle

Это расширение добавляет поля и директивы в схему 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"
      }
    ]
  }
}