Direktif tasarımı
Direktifler önemli bir rol oynar: GraphQL spec tarafından veya GraphQL sunucusunun kendisi tarafından yerel olarak desteklenmeyen özelliklerin uygulanmasına olanak tanır. Direktifler bu işlevsellik boşluğunu doldurmaya yardımcı olabilir; böylece API, bilinen ya da bilinmeyen gereksinimlerini karşılayabilir.
Bu nedenle direktifler, GraphQL sunucusunun temellerindeki son derece önemli bir unsurdur. Gato GraphQL, direktifler için sağlam ve güçlü bir mimari tasarıma dayanır; bu tasarım hem genişletilebilir hem de güçlü olmasını sağlar.
Düşük seviyeli işlevsellik
Bir tasarım kararı olarak motor, queries çözümlemek için doğrudan direktif ardışık düzenine bağlıdır. Bu nedenle direktifler, yanıtın depolandığı nesneye erişim ile düşük seviyeli bileşenler olarak ele alınır.
Sonuç olarak, herhangi bir özel direktif GraphQL yanıtını değiştirme gücüne sahiptir.
Bunun bariz bir kullanım örneği, queries içinde bir alandan null değer almak yerine yanıtı atlamayı tercih edip etmeyeceğimizi belirtmemize olanak tanıyan @remove direktifi'dir (bu özellikle ilgili spec'te bir sorun bulunmaktadır).
Verimli direktif çağrıları
Direktifler, etkilenen tüm nesneleri ve alanları tek bir çalıştırmada birlikte alır.
Örneğin, Google Translate API çağrısı mümkün olan en az sayıda yapılmalıdır. Bu queries'de yalnızca bir kez çağrılır ve 10 parça metin içerir (2 alan, title ve excerpt, 5 post için):
query {
posts(pagination:{ limit: 5 }) {
title
excerpt
titleES: title @translate(from: "en", to: "es")
excerptES: excerpt @translate(from: "en", to: "es")
}
}Bu queries'de API'ye 3 çağrı yapılır; her dil (İspanyolca, Fransızca ve Almanca) için bir tane, her biri 10 string olmak üzere tüm çağrılar eş zamanlıdır:
query {
posts(pagination:{ limit: 5 }) {
title
excerpt
titleES: title @translate(from: "en", to: "es")
excerptES: excerpt @translate(from: "en", to: "es")
titleDE: title @translate(from: "en", to: "de")
excerptDE: excerpt @translate(from: "en", to: "de")
titleFR: title @translate(from: "en", to: "fr")
excerptFR: excerpt @translate(from: "en", to: "fr")
}
}Fonksiyon imzası
Bu, alan direktifi arayüzüdür. Lütfen resolveDirective fonksiyonunun aldığı parametrelere dikkat edin:
public function resolveDirective(
RelationalTypeResolverInterface $relationalTypeResolver,
array $idFieldSet,
FieldDataAccessProviderInterface $fieldDataAccessProvider,
array $succeedingPipelineFieldDirectiveResolvers,
array $idObjects,
array $unionTypeOutputKeyIDs,
array $previouslyResolvedIDFieldValues,
array &$succeedingPipelineIDFieldSet,
array &$succeedingPipelineFieldDataAccessProviders,
array &$resolvedIDFieldValues,
array &$messages,
EngineIterationFeedbackStore $engineIterationFeedbackStore,
): void;Bu parametreler direktifin düşük seviyeli yapısını ortaya koyar:
$idFieldSet: direktif tarafından işlenecek alan başına ID listesi$succeedingPipelineIDFieldSet: ardışık düzende sonraki aşamadaki direktifler tarafından işlenecek alan başına ID listesi$resolvedIDFieldValues: yanıt nesnesi
Diğer parametreler şunları mümkün kılar: queries değişkenlerine erişmek ve dinamik değişkenler tanımlamak, direktifler arasında özel verilerle mesaj iletmek, hata ve uyarı oluşturmak, kullanımdan kaldırmaları tanımlamak ve görüntülemek ve metrikleri depolamak.