0Pricing
PHP Academy · Ders

graphql-php ile Şema Oluşturma

webonyx/graphql-php ile türleri ve bir şemayı tanımlayın.

graphql-php ile Şema Oluşturma, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 2. 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.

graphql-php: Başvuru Uygulaması

webonyx/graphql-php, GraphQL başvuru uygulamasının PHP'ye uyarlanmış fiilî sürümüdür. Tür sistemini, ayrıştırıcıyı, doğrulayıcıyı ve yürütücüyü sağlar. Şemanızı programatik olarak (PHP nesneleriyle) veya SDL'den (şema öncelikli) tanımlayabilirsiniz. Bu derste, her parçanın tam olarak ne yaptığını anlamanız için şemayı elle oluşturuyoruz.

composer require webonyx/graphql-php

Skalerler ve Tür Kayıt Defteri

Her GraphQL değeri en sonunda bir skaler değere dayanır: Int, Float, String, Boolean, ID. graphql-php'te bunlar Type arayüzünde bulunur. Nesne türleri birbirlerine (ve kendilerine) başvurduğundan, yaygın bir yaklaşım her türü önbelleğe alan statik bir TypeRegistry kullanmaktır; böylece her türü yalnızca bir kez oluşturursunuz.

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

// Built-in scalars, returned as singletons:
var_dump(Type::int()->name);     // "Int"
var_dump(Type::string()->name);  // "String"
var_dump(Type::id()->name);      // "ID"
var_dump(Type::nonNull(Type::string())->toString()); // "String!"

ObjectType Tanımlama

Bir ObjectType, bir name ve bir fields eşlemesine sahiptir. Her alan kendi type'ını ve isteğe bağlı olarak bir resolve geri çağrısını bildirir. resolve sağlamazsanız graphql-php, üst değerdeki eşleşen dizi anahtarını veya özelliği/alıcı yöntemini okuyan varsayılan çözücüyü kullanır.

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

$postType = new ObjectType([
    'name' => 'Post',
    'fields' => [
        'id'    => Type::nonNull(Type::id()),
        'title' => Type::nonNull(Type::string()),
        'body'  => Type::string(),
    ],
]);

Null Olmayan ve Liste Sarmalama

Sarmalama türleri boş değer alabilirliği ve çokluğu ifade eder:

  • Type::nonNull(T) → T! (asla boş değil).
  • Type::listOf(T) → [T] (muhtemelen boş olabilen ve üyeleri de muhtemelen boş olabilen bir liste).
  • [Post!]! = boş olamayan gönderilerden oluşan, boş olamayan bir liste → nonNull(listOf(nonNull($postType))).

Bunu doğru yapınız: bu, şemanızın istemcilerle yaptığı boş değer sözleşmesidir.

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

// [Post!]!  -- a required list whose elements are never null
$wrapped = Type::nonNull(Type::listOf(Type::nonNull(Type::string())));
echo $wrapped->toString(), "\n"; // [String!]!

Tembel Alanlar Döngüsel Başvuruları Kırar

Bir User'ın posts alanı, bir Post'un da bir author alanı (bir User) vardır. Birbirlerine başvuran türleri oluşturmak için fields değerini dizi yerine bir kapatma olarak iletiniz. Kapatma, her iki tür de oluşturulduktan sonra tembel olarak çalışır ve yumurta-tavuk sorununu ortadan kaldırır.

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

class Types {
    private static array $cache = [];

    public static function user(): ObjectType {
        return self::$cache['User'] ??= new ObjectType([
            'name' => 'User',
            'fields' => fn() => [           // lazy!
                'id'    => Type::nonNull(Type::id()),
                'name'  => Type::nonNull(Type::string()),
                'posts' => Type::listOf(self::post()),
            ],
        ]);
    }

    public static function post(): ObjectType {
        return self::$cache['Post'] ??= new ObjectType([
            'name' => 'Post',
            'fields' => fn() => [
                'id'     => Type::nonNull(Type::id()),
                'title'  => Type::nonNull(Type::string()),
                'author' => self::user(),    // back-reference
            ],
        ]);
    }
}

Alan Parametreleri

Alanlar parametre alabilir. Bunları args anahtarının altında tanımlayınız; çözücünün ikinci parametresi ($args) olarak gelirler. Parametrelerin kendileri de tür belirtilmiş olabilir, boş olamaz ve defaultValue taşıyabilir.

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

$userField = [
    'type' => Type::string(),
    'args' => [
        'id'     => Type::nonNull(Type::id()),
        'locale' => ['type' => Type::string(), 'defaultValue' => 'en'],
    ],
    'resolve' => fn($root, array $args) => "user {$args['id']} ({$args['locale']})",
];

Kök Sorgu Türü

Her şema bir kök Query türüne ihtiyaç duyar — istemcilerin başlangıç yapabileceği giriş noktaları burada bulunur. Burada uçtan uca çalıştırabilmek için tek bir hello alanı sunuyoruz. Kök çözücünün ilk argümanı şemanın rootValue değeridir (çoğu zaman null).

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

$queryType = new ObjectType([
    'name' => 'Query',
    'fields' => [
        'hello' => [
            'type' => Type::string(),
            'args' => ['name' => Type::nonNull(Type::string())],
            'resolve' => fn($root, array $args) => 'Hello, ' . $args['name'],
        ],
    ],
]);

Şemayı Birleştirme ve Yürütme

Sorgu türünü bir Schema içine sarınız ve bir sorgu dizesini GraphQL::executeQuery() üzerinden çalıştırınız. Sonuç nesnesi, toArray() aracılığıyla standart { data, errors } dizisine dönüştürülür.

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

use GraphQL\GraphQL;
use GraphQL\Type\Schema;
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;

$queryType = new ObjectType([
    'name' => 'Query',
    'fields' => [
        'hello' => [
            'type' => Type::string(),
            'args' => ['name' => Type::nonNull(Type::string())],
            'resolve' => fn($root, $args) => 'Hello, ' . $args['name'],
        ],
    ],
]);

$schema = new Schema(['query' => $queryType]);
$result = GraphQL::executeQuery($schema, '{ hello(name: "Ada") }');
echo json_encode($result->toArray());
// {"data":{"hello":"Hello, Ada"}}

BuildSchema ile Şema Öncelikli Alternatif

SDL'yi tercih ediyorsanız BuildSchema::build(), bir şema dizesini yürütülebilir bir şemaya ayrıştırır. Ardından çözücüleri ayrı olarak bağlarsınız (ör. bir alan çözücü geri çağrısı); böylece tür tanımları bildirimsel kalırken mantık PHP'de kalır.

<?php
use GraphQL\Utils\BuildSchema;

$sdl = <<<'GQL'
type Query {
  hello(name: String!): String
}
GQL;

$schema = BuildSchema::build($sdl);
// Provide resolvers via the executeQuery $fieldResolver argument
// or with a type config decorator.

Yayınlamadan Önce Doğrulayınız

graphql-php, gelen sorguları yürütmeden önce şemaya karşı otomatik olarak doğrular. Ayrıca $schema->assertValid() ile yapı/CI sırasında şemanın kendi içinde tutarlı olduğunu da doğrulayabilirsiniz — yazım hatalarını ve bozuk başvuruları dağıtımdan önce, istek sırasında değil, yakalayınız.

<?php
use GraphQL\Type\Schema;

/** @var Schema $schema */
$schema->assertValid(); // throws InvariantViolation on a broken schema
echo "schema OK\n";

EnumType ve CustomScalarType

Nesnelerin ötesinde, çoğu şemayı tamamlayan iki tür kategorisi daha vardır. EnumType, bir alanı sabit bir adlandırılmış değer kümesiyle sınırlar. CustomScalarType, değerlerin sınırda doğrulanıp normalleştirilmesi için kendi serialize/parseValue/parseLiteral mantığınızla alanınıza özgü skalerler (DateTime, E-posta) tanımlamanızı sağlar.

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

$statusEnum = new EnumType([
    'name' => 'PostStatus',
    'values' => [
        'DRAFT'     => ['value' => 0],
        'PUBLISHED' => ['value' => 1],
        'ARCHIVED'  => ['value' => 2],
    ],
]);
// A field typed as $statusEnum only accepts DRAFT/PUBLISHED/ARCHIVED.

Hızlı Kontrol

fields değerini neden bir kapatma olarak geçirirsiniz?

Özet

Şemayı sıfırdan oluşturdunuz:

  • Skalerler ve sarmalama türleri (nonNull, listOf) boş değer/çokluk sözleşmesini ifade eder.
  • Alan eşlemesine (veya tembel kapatmaya) sahip ObjectType, şekillerinizi tanımlar.
  • Önbellekleyen bir TypeRegistry, döngüsel başvuruları yönetir.
  • Alanlar tür belirtilmiş args alır; kök Query türü giriş noktasıdır.
  • GraphQL::executeQuery() bunu çalıştırır; assertValid() ise şemayı CI'da korur.

Sıradaki konu: çözücüler, mutasyonlar ve abonelikler.

Sıkça Sorulan Sorular

“graphql-php ile Şema Oluşturma” dersi ücretsiz mi?

Evet — “graphql-php ile Şema Oluşturma” 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.

“graphql-php ile Şema Oluşturma” dersinde ne öğreneceğim?

webonyx/graphql-php ile türleri ve bir şemayı tanımlayın. 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 2. dersidir.

“graphql-php ile Şema Oluşturma” 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