Fonctions PHP via le Schéma
Cette extension ajoute des champs et des directives au schéma GraphQL qui exposent des fonctionnalités couramment présentes dans les langages de programmation (comme PHP).
Description
Les champs et directives de fonction sont utiles pour manipuler les données une fois qu'elles ont été récupérées, nous permettant de transformer la valeur d'un champ de la manière souhaitée, et nous accordant de puissantes capacités d'import/export de données.
Cette requête, contenant une variété de champs et directives de fonction :
{
_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"]
)
}...produit :
{
"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"
}
}
}Champs de Fonction
Les champs de fonction sont des Champs Globaux, ils sont donc ajoutés à chaque type du schéma GraphQL : dans QueryRoot, mais aussi dans Post, User, etc.
Voici la liste des champs de fonction.
_and
Retourne une opération AND parmi plusieurs propriétés booléennes.
_arrayAddItem
Ajoute un élément au tableau.
_arrayCombine
Crée un objet JSON en utilisant les éléments d'un tableau comme clés, et les éléments d'un autre tableau comme valeurs.
_arrayChunk
Divise un tableau en morceaux.
_arrayDiff
Retourne un tableau contenant tous les éléments du premier tableau qui ne sont présents dans aucun des autres tableaux.
_arrayEncodeAsJSONString
Encode un tableau en JSON sous forme de chaîne.
_arrayFill
Crée un tableau rempli de valeurs.
_arrayFilter
Filtre les éléments nuls ou vides du tableau.
_arrayFlipToObject
Échange toutes les clés numériques avec leurs valeurs associées dans un tableau, en retournant un objet.
_arrayInnerJoinJSONObjectProperties
Remplit les objets JSON à l'intérieur d'un tableau cible avec des propriétés d'un objet JSON d'un tableau source, où une certaine propriété est la même pour les deux objets.
_arrayItem
Accède à l'élément à la position donnée dans le tableau.
_arrayJoin
Joint toutes les chaînes d'un tableau, en utilisant un séparateur fourni.
_arrayKeys
Clés d'un tableau.
_arrayLength
Nombre d'éléments dans un tableau.
_arrayMerge
Fusionne deux tableaux ou plus ensemble.
_arrayPad
Remplit un tableau jusqu'à la longueur spécifiée avec une valeur.
_arrayRandom
Sélectionne aléatoirement un élément parmi ceux fournis.
_arrayRemoveFirst
Supprime le premier élément du tableau.
_arrayRemoveLast
Supprime le dernier élément du tableau.
_arrayReverse
Inverse un tableau.
_arraySearch
Recherche à quelle position un élément est placé dans le tableau. S'il est trouvé, retourne sa position, sinon retourne false.
_arraySetItem
Définit un élément à une position donnée du tableau.
_arraySlice
Extrait une tranche d'un tableau.
_arraySplice
Supprime une portion d'un tableau et la remplace par autre chose.
_arrayUnique
Filtre tous les éléments dupliqués du tableau.
_date
Retourne une chaîne formatée selon la chaîne de format donnée en utilisant le timestamp entier donné (timestamp Unix) ou l'heure actuelle si aucun timestamp n'est fourni. En d'autres termes, timestamp est optionnel et prend par défaut la valeur de time() (fournie via le champ _time).
_echo
Répète l'entrée telle quelle, quelle qu'elle soit.
_equals
Indique si le résultat d'un champ est égal à une certaine valeur.
_floatCeil
Arrondit un nombre à l'entier supérieur.
_floatDivide
Divise un nombre par un autre nombre.
_greaterThan
Indique si nombre1 > nombre2.
_greaterThanOrEquals
Indique si nombre1 >= nombre2.
_if
Si une propriété booléenne est vraie, exécute un champ, sinon exécute un autre champ.
_inArray
Indique si le tableau contient la valeur.
_intAdd
Ajoute un entier à un autre entier.
_intArraySum
Somme des éléments entiers du tableau.
_intMultiply
Multiplie un entier par un autre entier.
_intSubtract
Soustrait un entier d'un autre entier.
_isEmpty
Indique si une valeur est vide.
_isNull
Indique si une valeur est nulle.
_lowerThan
Indique si nombre1 < nombre2.
_lowerThanOrEquals
Indique si nombre1 <= nombre2.
_makeTime
Retourne le timestamp Unix correspondant aux arguments donnés. Ce timestamp est un entier long contenant le nombre de secondes entre l'Époque Unix (1er janvier 1970 00:00:00 GMT) et l'heure spécifiée.
Tout argument optionnel omis ou nul sera défini à la valeur actuelle selon la date et l'heure locales.
_not
Retourne la valeur opposée d'une propriété booléenne.
_notEmpty
Indique si la valeur n'est pas vide.
_notEquals
Indique si les deux valeurs ne sont pas égales.
_notInArray
Indique si le tableau ne contient pas la valeur.
_notNull
Indique si la valeur n'est pas null.
_objectAddEntry
Ajoute une entrée à l'objet.
_objectEncodeAsJSONString
Encode un objet en JSON sous forme de chaîne.
_objectFilter
Filtre les éléments nuls ou vides de l'objet.
_objectFlip
Inverse les clés et les valeurs d'un objet JSON.
_objectIntersectKey
Calcule l'intersection d'objets en utilisant les clés pour la comparaison.
_objectKeepProperties
Conserve uniquement des propriétés spécifiques dans l'objet JSON.
_objectMerge
Fusionne deux objets ou plus ensemble.
_objectProperties
Récupère les propriétés d'un objet JSON.
_objectProperty
Récupère une propriété d'un objet JSON.
_objectRemoveEntry
Supprime une entrée de l'objet JSON.
_objectRemoveProperties
Supprime une ou plusieurs entrées de l'objet JSON.
_objectValues
Récupère les valeurs d'un objet JSON.
_or
Retourne une opération OR parmi plusieurs propriétés booléennes.
_propertyExistsInJSONObject
Indique si une propriété existe dans un objet JSON.
_propertyIsSetInJSONObject
Indique si une propriété existe et n'est pas null dans un objet JSON.
_sprintf
Remplace des espaces réservés à l'intérieur d'une chaîne par les valeurs fournies.
_strAppend
Ajoute une chaîne à une autre chaîne.
_strArrayReplace
Remplace une chaîne par une autre chaîne dans un tableau.
_strArrayReplaceMultiple
Remplace une liste de chaînes par une autre liste de chaînes dans un tableau.
_strContains
Indique si une chaîne contient une autre chaîne.
_strDecodeJSONObject
Décode une chaîne en un objet JSON, ou retourne null si ce n'est pas possible.
_strDecodeList
Décode une chaîne en un tableau (de n'importe quel type), ou retourne null si ce n'est pas possible.
_strEndsWith
Indique si une chaîne se termine par une autre chaîne.
_strLength
Longueur de la chaîne.
_strLowerCase
Transforme une chaîne en minuscules.
_strPad
Remplit une chaîne jusqu'à une certaine longueur avec une autre chaîne.
_strPos
Position d'une sous-chaîne dans la chaîne, ou null si non trouvée.
_strRegexFindMatches
Exécute une expression régulière pour extraire toutes les correspondances d'une chaîne.
_strRegexReplace
Exécute une expression régulière pour rechercher et remplacer une chaîne.
_strRegexReplaceMultiple
Exécute des expressions régulières pour rechercher et remplacer des chaînes.
_strRepeat
Répète une chaîne.
_strReplace
Remplace une chaîne par une autre chaîne.
_strReplaceMultiple
Remplace une liste de chaînes par une autre liste de chaînes.
_strReverse
Inverse une chaîne.
_strShuffle
Mélange aléatoirement une chaîne.
_strStartsWith
Indique si une chaîne commence par une autre chaîne.
_strStripSlashes
Retourne une chaîne avec les barres obliques inversées supprimées. (\' devient ' et ainsi de suite.) Les doubles barres obliques inversées (\\) sont transformées en une seule barre oblique inversée (\).
_strSubstr
Retourne une partie d'une chaîne.
_strTitleCase
Transforme une chaîne en capitalisation de titre.
_strToTime
Analyse presque n'importe quelle description textuelle de date-heure en anglais en un timestamp Unix.
_strTrim
Supprime les espaces blancs (ou autres caractères) du début et de la fin d'une chaîne.
_strUpperCase
Transforme une chaîne en majuscules.
_strWordCount
Nombre de mots dans la chaîne.
_time
Retourne l'heure actuelle.
Directives de Fonction
Voici la liste des directives de fonction.
@arrayAddItem
Ajoute un élément au tableau.
@arrayDiff
Calcule la différence avec un autre tableau.
@arrayFilter
Filtre les éléments nuls ou vides du tableau.
@arrayMerge
Fusionne le tableau avec un autre tableau.
@arrayPad
Remplit un tableau jusqu'à la longueur spécifiée avec une valeur.
@arrayRemoveFirst
Supprime le premier élément du tableau.
@arrayRemoveLast
Supprime le dernier élément du tableau.
@arrayReverse
Inverse un tableau.
@arraySetItem
Définit un élément à une position donnée du tableau.
@arraySlice
Extrait une tranche d'un tableau.
@arraySplice
Supprime une portion d'un tableau et la remplace par autre chose.
@arrayUnique
Filtre tous les éléments dupliqués du tableau.
@boolOpposite
Convertit un booléen en sa valeur opposée.
@floatDivide
Divise la valeur du champ par un nombre flottant.
@intAdd
Ajoute un entier à la valeur du champ.
@intMultiply
Multiplie un entier par la valeur du champ.
@intSubtract
Soustrait un entier de la valeur du champ.
@objectAddEntry
Ajoute une entrée à l'objet JSON.
@objectFilter
Filtre les éléments nuls ou vides d'un objet.
@objectKeepProperties
Conserve uniquement des propriétés spécifiques de l'objet JSON.
@objectRemoveEntry
Supprime une entrée de l'objet JSON.
@objectRemoveProperties
Supprime des propriétés spécifiques de l'objet JSON.
@setNull
Définit la valeur du champ comme null.
@strAppend
Ajoute une chaîne à la fin de la chaîne dans la valeur du champ.
@strLowerCase
Convertit une chaîne en minuscules.
@strPad
Remplit une chaîne jusqu'à une certaine longueur avec une autre chaîne.
@strPrepend
Ajoute une chaîne au début de la chaîne dans la valeur du champ.
@strRegexReplace
Exécute une expression régulière pour rechercher et remplacer une chaîne (voir documentation de la fonction PHP preg_replace).
@strRegexReplaceMultiple
Exécute des expressions régulières pour rechercher et remplacer une liste de chaînes (voir documentation de la fonction PHP preg_replace).
@strRepeat
Répète une chaîne.
@strReplace
Remplace une chaîne par une autre chaîne.
@strReplaceMultiple
Remplace une liste de chaînes par une autre liste de chaînes.
@strReverse
Inverse une chaîne.
@strShuffle
Mélange aléatoirement une chaîne.
@strStripSlashes
Retourne une chaîne avec les barres obliques inversées supprimées. (\' devient ' et ainsi de suite.) Les doubles barres obliques inversées (\\) sont transformées en une seule barre oblique inversée.
@strSubstr
Retourne une partie d'une chaîne.
@strTitleCase
Convertit une chaîne en capitalisation de titre.
@strTrim
Supprime les espaces blancs (ou autres caractères) du début et de la fin d'une chaîne.
@strUpperCase
Convertit une chaîne en majuscules.
Exemples
Champs de Fonction
Bien que nous ayons un champ Post.hasComments, nous pourrions avoir besoin de la valeur opposée. Au lieu de créer un nouveau champ Post.notHasComments (pour lequel il faudrait modifier le code PHP), nous pouvons utiliser la fonctionnalité Field to Input pour passer la valeur de hasComments en entrée d'un champ not, calculant ainsi la nouvelle valeur toujours dans la requête GraphQL :
{
posts {
id
hasComments
notHasComments: _not(value: $__hasComments)
}
}Nous pouvons appliquer des champs de fonction plusieurs fois pour effectuer un calcul plus complexe, comme générer un champ summary basé sur les valeurs d'autres champs :
{
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
)
}
}En combinaison avec l'extension HTTP Client, nous pouvons générer dynamiquement un endpoint d'API auquel se connecter (basé sur les données de notre site), puis extraire un champ spécifique des données retournées :
{
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"
}
)
}
}...produisant :
{
"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 Fonction
Si cette requête :
query {
posts {
title
}
}...produit ces résultats :
{
"data": {
"posts": [
{
"title": "Hello world!"
},
{
"title": "lovely weather"
}
]
}
}...alors cette requête :
query {
posts {
title @strUpperCase
}
}...produira :
{
"data": {
"posts": [
{
"title": "HELLO WORLD!"
},
{
"title": "LOVELY WEATHER"
}
]
}
}