0Pricing
PHP Academy · Ders

Çözücüler, Mutasyonlar ve Abonelikler

Verileri çözücüler aracılığıyla alın ve değiştirin.

Çözücüler, Mutasyonlar ve Abonelikler, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.

Mantık Çözücülerde Yaşar

Şema neyin var olduğunu tanımlar; çözücüler her alanın değerinin nasıl üretileceğine karar verir. Çözücü, çağrılabilir bir öğeden ibarettir. Mutasyonlar, durumu değiştiren çözücülerdir. Abonelikler, zaman içinde değer akışı sağlar. Bu derste üçünü ve bunları birbirine bağlayan yürütme modelini ele alacağız.

Çözücü İmzası

Her çözücü dört argüman alır: ($objectValue, $args, $context, ResolveInfo $info).

  • $objectValue — üst öğenin çözümlenmiş değeri (en üst düzeydeki rootValue).
  • $args — alanın parametreleri.
  • $context — istek başına paylaşılan durum (veritabanı bağlantısı, geçerli kullanıcı).
  • $info — AST/alan meta verileri (alan adı, seçim kümesi, yol).
<?php
use GraphQL\Type\Definition\ResolveInfo;

$resolve = function ($objectValue, array $args, $context, ResolveInfo $info) {
    // $context['db'], $context['user'] set up per request
    return $context['db']->find($args['id']);
};

Varsayılan Çözücü

resolve sağlamazsanız graphql-php'in varsayılan çözücüsü, alan adını üst değerden okur: bir dizi anahtarını, genel erişimli bir özelliği veya bir get<Field>() yöntemini. Bu, üst öğeden düz diziler veya veri aktarım nesneleri döndürerek bütün nesne türlerini çoğu zaman hiç ek kod yazmadan çözebileceğiniz anlamına gelir.

<?php
// Parent returns this array; child fields resolve by key automatically:
$user = [
    'id' => 1,
    'name' => 'Ada',
    'email' => 'ada@example.com',
];
// 'name' field -> $user['name'] with no explicit resolver needed
var_dump($user['name']);

Çözücüler Üst Öğeden Alt Öğeye Çağrılır

Yürütme yukarıdan aşağıya ilerler: Query.user çözücüsü bir kullanıcı döndürür; bu değer User.posts için $objectValue olur ve bunun sonucu da her bir Post.title için üst öğe olur. Bu çağrı zincirini anlamak çok önemlidir — N+1 sorunu tam olarak burada ortaya çıkar (bir sonraki derste ele alınacaktır).

<?php
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;

$userType = new ObjectType([
    'name' => 'User',
    'fields' => fn() => [
        'id'    => Type::id(),
        'name'  => Type::string(),
        'posts' => [
            'type' => Type::listOf(Type::string()),
            // $user is the parent value resolved by Query.user
            'resolve' => fn($user) => Posts::titlesForUser($user['id']),
        ],
    ],
]);

Asenkron Sonuçlar Döndürme

Çözücüler bir değer ya da ertelenmiş bir sonuç döndürebilir. graphql-php, eşzamanlı bir sonuç uyarlayıcısıyla birlikte gelir; ReactPHP/Amp uyarlayıcılarıyla çözümleme ertelenip toplu hâle getirilebilir. Eşzamanlı çalışmada bile Deferred nesnelerini döndürmek, yürütücünün işi toplamasını ve geçerli çözümleme düzeyinden sonra çalıştırmasını sağlar — DataLoader'ın temelindeki mekanizma budur.

<?php
use GraphQL\Deferred;

$resolve = function ($post) use ($authorBuffer) {
    $authorBuffer->add($post['author_id']);   // queue the id
    return new Deferred(function () use ($authorBuffer, $post) {
        $authorBuffer->loadOnce();             // one batched query
        return $authorBuffer->get($post['author_id']);
    });
};

Mutasyonlar Durumu Değiştirir

Bir mutasyon, Mutation adlı bir kök türden ibarettir. Kural gereği, en üst düzey alanları yan etkilerin sıralı olmasını sağlamak için (paralel değil) art arda çalışır. Girdiler genellikle temiz bir imza için bir InputObjectType içinde gruplanır.

<?php
use GraphQL\Type\Definition\InputObjectType;
use GraphQL\Type\Definition\Type;

$createPostInput = new InputObjectType([
    'name' => 'CreatePostInput',
    'fields' => [
        'title' => Type::nonNull(Type::string()),
        'body'  => Type::string(),
    ],
]);

Mutasyon Türünü Bağlama

Mutasyon alanı girdi nesnesini bir parametre olarak alır ve oluşturulan varlığı döndürür (böylece istemciler aynı gidiş-dönüşte alanları okuyabilir). Doğrulama ve yetkilendirmeyi çözücü içinde yapınız; başarısızlık durumunda hata fırlatınız.

<?php
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;

$mutationType = new ObjectType([
    'name' => 'Mutation',
    'fields' => [
        'createPost' => [
            'type' => $postType,
            'args' => ['input' => Type::nonNull($createPostInput)],
            'resolve' => function ($root, array $args, $context) {
                if (!$context['user']) {
                    throw new \RuntimeException('Unauthenticated');
                }
                return PostRepo::create($args['input'], $context['user']);
            },
        ],
    ],
]);

Hatalar: İstemciye Gösterilebilir ve Dahili

graphql-php, dahili bilgilerin sızmasını önlemek için varsayılan olarak istisna iletilerini gizler ve Internal server error gösterir. İstemcilere bir ileti göstermek için GraphQL\\Error\\ClientAware uygulayınız ve isClientSafe() yönteminden true döndürünüz. extensions aracılığıyla makine tarafından okunabilir kodlar ekleyiniz.

<?php
use GraphQL\Error\ClientAware;

class ValidationError extends \RuntimeException implements ClientAware {
    public function isClientSafe(): bool { return true; }
    // older versions also used getCategory(): string
}

Abonelikler: Kavram

Bir Abonelik kök türü, olaylar gerçekleştiğinde (yeni ileti, fiyat güncellemesi) istemcilerin sonuç akışı almasını sağlar. GraphQL belirtimi, abonelik anlam kurallarını tanımlar; ancak graphql-php her çağrıda tek bir işlemi yürütür — uzun süre çalışan bir yuva sunucusunu kendisi çalıştırmaz. Aktarımı sizin sağlamanız gerekir.

  • graphql-php, gönderdiğiniz her olay için aboneliğin yükünü çözümler.
  • Bir aktarım (Ratchet/Mercure/Pusher üzerinden WebSocket), olayları istemcilere iletir.

Abonelik Çözücüsünün Yapısı

Uygulamada bir aboneliği abone olma adımına (ilgiyi kaydeder ve bir olay kaynağı döndürür) ve çözümleme adımına (her olayı alanın yüküne eşler) ayırırsınız. Birçok PHP yığını, graphql-php'i Mercure veya bir yayınla/abone ol aracısıyla birlikte kullanır; aşağıdaki çözücü, graphql-php'in sorumlu olduğu olay başına eşlemeyi gösterir.

<?php
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;

$subscriptionType = new ObjectType([
    'name' => 'Subscription',
    'fields' => [
        'messageAdded' => [
            'type' => $messageType,
            'args' => ['channelId' => Type::nonNull(Type::id())],
            // graphql-php resolves each pushed event into the payload;
            // a WebSocket/Mercure transport drives when this runs.
            'resolve' => fn($event) => $event['message'],
        ],
    ],
]);

Bağlamınız Kimlik Doğrulama ve DI Kanalınızdır

Üçüncü çözücü argümanı olan $context, istek başına bir kez oluşturulur ve her çözücüye aktarılır. Kimliği doğrulanmış kullanıcı, veritabanı bağlantısı ve DataLoaders için doğru yer burasıdır. Kimlik doğrulamayı burada merkezileştirmek çözücülerin yalın kalmasını sağlar — çözücüler kullanıcının kim olduğunu yeniden çıkarmak yerine bunu bağlama sorar.

<?php
require 'vendor/autoload.php';

// Built once per HTTP request, passed to executeQuery():
$context = [
    'user' => authenticate($_SERVER['HTTP_AUTHORIZATION'] ?? ''),
    'db'   => $pdo,
];

$resolve = function ($root, array $args, array $context) {
    if ($context['user'] === null) {
        throw new \RuntimeException('Unauthenticated');
    }
    return $context['db']->find($args['id']);
};

Hızlı Kontrol

Bir istisna iletisini GraphQL istemcilerine nasıl görünür kılarsınız?

Özet

GraphQL'in yürütme merkezini öğrendiniz:

  • Çözüciler ($value, $args, $context, $info) alır; varsayılan çözücü üst öğedeki anahtarları ve alıcı yöntemlerini okur.
  • Çözümleme üst öğeden alt öğeye zincirlenir — N+1 sorununun kaynağı budur.
  • Deferred/ertelenmiş sonuçların döndürülmesi toplu işlem yapmayı sağlar.
  • Mutasyonlar, InputObjectType kullanan sıralı kök alanlardır; kimlik doğrulama/yetkilendirme ve doğrulamayı çözücü içinde yapınız.
  • Abonelikler yük çözümlemesini tanımlar; aktarımı ise siz sağlarsınız.
  • ClientAware, istemcilerin hangi hata iletilerini görebileceğini denetler.

Sıradaki konu: DataLoader ile N+1 sorununu ortadan kaldırmak.

Sıkça Sorulan Sorular

“Çözücüler, Mutasyonlar ve Abonelikler” dersi ücretsiz mi?

Evet — “Çözücüler, Mutasyonlar ve Abonelikler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.

“Çözücüler, Mutasyonlar ve Abonelikler” dersinde ne öğreneceğim?

Verileri çözücüler aracılığıyla alın ve değiştirin. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

PHP Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Çözücüler, Mutasyonlar ve Abonelikler” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. GraphQL ve REST Karşılaştırması
  2. graphql-php ile Şema Oluşturma
  3. Çözücüler, Mutasyonlar ve Abonelikler
  4. Performans: N+1 ve DataLoader
← PHP Academy Sayfasına Dön