Dinamik Değişkenler
Aşağıdaki GraphQL query'si, kaç gönderi alınacağını belirlemek için $limit değişkenini alır ve değişkenin türü olan Int, operasyonda bildirilmek zorundadır:
query GetPosts($limit: Int) {
posts(limit: $limit) {
id
title
}
}Bu, GraphQL'deki beklenen davranıştır; değişken değerini aynı belgede tanımlı bir JSON sözlüğünde sağlarız:
{
"limit": 3
}Bu, pek çok dil tarafından paylaşılan "statik" bir davranıştır. PHP'de, örneğin, fonksiyon argümanları türlerini belirtebilir; aşağıdaki kodda $number girdisi bir tam sayı olarak tanımlanmıştır:
function double(int $number): int
{
return $number * 2;
}Şimdi, PHP fonksiyonunun gövdesinde bir değişken bildirdiğimizde türünü belirtmeyiz; değişkenin türü, değişkenin kullanıldığı bağlam tarafından belirlenir. Aşağıdaki kodda $double değişkenine bir tam sayı değeri atamak, bu değişkeni tam sayı yapar:
function double(int $number): int
{
// This var is an integer, but we don't need to declare it
$double = $number * 2;
return $double;
}Özel direktifler sayesinde GraphQL sunucusu benzer bir davranış sağlayabilir ve dinamik değişkenleri destekleyebilir; dinamik bir değişken, değerini istemci tarafından sağlanmak yerine sunucuda query çözümlenirken alır.
Gato GraphQL'in Çoklu Query Çalıştırma eklentisi, bir alanın değerini (dinamik) bir değişkene aktarmaya izin veren @export özel direktifiyle birlikte gelir; ardından bu değişkenin değerini farklı bir operasyondaki alan argümanından okuyabiliriz:
query ExportLoggedInUserName {
me {
name @export(as: "userName")
}
}
query GetPostsContainingString
@depends(on: "ExportLoggedInUserName")
{
posts(filter: { search: $userName }) {
id
title
}
}$userName değişkeni dinamiktir ve türünün (String) onu kullanan operasyonda (GetPostsContainingString) tanımlanmasına gerek yoktur. GraphQL sunucusu bağlamı zaten anlar.
Değişken değerini eşleşmeyen bir türle kullanmaya çalışırsak, aşağıdaki query'de olduğu gibi (Int beklenirken dinamik değişken bir String ise):
query ExportDynamicVariable {
_echo(value: "Hello world!") @export(as: "stringVar") # Exported: String
}
query UseVariable
@depends(on: "ExportDynamicVariable")
{
posts(
pagination: {
limit: $stringVar # Expected: Int, received: String
}
) {
id
}
}...GraphQL sunucusu değeri dönüştürmede başarısız olur ve bir hata döndürür:
{
"errors": [
{
"message": "Cannot cast value 'Hello world!' for type 'Int'",
"locations": [
{
"line": 10,
"column": 13
}
],
"extensions": {
"path": [
"{limit: $stringVar}",
"(pagination: {limit: $stringVar})",
"posts(pagination: {limit: $stringVar}) { ... }",
"query UseVariable @depends(on: \"ExportDynamicVariable\") { ... }"
],
"type": "QueryRoot",
"field": "posts(pagination: {limit: $stringVar}) { ... }",
"id": "root",
"code": "gql@5.6.1[16]",
"specifiedBy": "https:\/\/spec.graphql.org\/draft\/#sec-Values-of-Correct-Type"
}
}
]
}GraphQL Spesifikasyonu
Bu işlevsellik şu an GraphQL spesifikasyonunun bir parçası değildir, ancak aşağıda talep edilmiştir: