API geliştirme dünyasında, REST API yerine GraphQL kullanımı giderek popüler hale geliyor. GraphQL, esnek veri sorgulama yetenekleri ve gereksiz veri transferini önleme avantajıyla dikkat çekiyor. Bu yazıda, Laravel ile bir GraphQL API oluşturmayı, query (sorgu) ve mutation (veri değiştirme işlemleri) gibi temel kavramları ele alacağız. Ayrıca, gerçek zamanlı veriyle çalışmanın temellerine de değineceğiz.
GraphQL Nedir?
GraphQL, Facebook tarafından geliştirilen ve 2015 yılında açık kaynak olarak yayınlanan bir sorgulama dilidir. REST API'den farklı olarak, istemcilerin yalnızca ihtiyaç duydukları veriyi sorgulamasına olanak tanır. Örneğin, REST'te bir kullanıcı sorgusu yapıldığında fazla veri dönebilirken, GraphQL'de yalnızca belirli alanları seçebilirsiniz. Bu, verimliliği artırır ve API performansını iyileştirir.
Laravel'de GraphQL Kurulumu
Laravel ile GraphQL API geliştirmek için rebing/graphql-laravel paketini kullanabiliriz. Bu paket, Laravel uygulamanıza GraphQL desteği ekler.
1. Paketi Yükleyin
composer require rebing/graphql-laravel
2. Paketi Kaydedin ve Konfigüre Edin
config/app.php dosyasına aşağıdaki sağlayıcıyı ekleyin:
'providers' => [
Rebing\GraphQL\GraphQLServiceProvider::class,
];
Konfigürasyon dosyasını yayınlamak için:
php artisan vendor:publish --provider="Rebing\GraphQL\GraphQLServiceProvider"
Bu işlemle birlikte config/graphql.php dosyası oluşturulur ve buradan GraphQL yapılandırmasını düzenleyebilirsiniz.
GraphQL Şema ve Tip Tanımlama
GraphQL'de şemalar, API'nizin nasıl çalıştığını ve hangi veri yapılarını döndüreceğini tanımlar. Laravel'de her bir veri tipi için bir Type sınıfı oluşturmanız gerekir.
Bir Kullanıcı Tipi (User Type) Tanımlama
// app/GraphQL/Type/UserType.php
namespace App\GraphQL\Type;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Type as GraphQLType;
class UserType extends GraphQLType
{
protected $attributes = [
'name' => 'User',
'description' => 'User data type'
];
public function fields(): array
{
return [
'id' => [
'type' => Type::nonNull(Type::int()),
'description' => 'The ID of the user'
],
'name' => [
'type' => Type::string(),
'description' => 'The name of the user'
],
'email' => [
'type' => Type::string(),
'description' => 'The email of the user'
],
];
}
}
Bu sınıf, kullanıcılar için sorgularda hangi alanların döndürüleceğini tanımlar.
Query ve Mutation
Query (Sorgu)
Query, GraphQL'de veri okuma işlemlerini ifade eder. Örneğin, aşağıdaki sorgu, kullanıcı listesini döndürür:
// app/GraphQL/Query/UsersQuery.php
namespace App\GraphQL\Query;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Query;
use App\Models\User;
class UsersQuery extends Query
{
protected $attributes = [
'name' => 'users',
];
public function type(): Type
{
return Type::listOf(\GraphQL::type('User'));
}
public function resolve($root, $args)
{
return User::all();
}
}
Bu query, tüm kullanıcıları döndürmek için User modelini kullanır.
Mutation (Veri Değiştirme İşlemleri)
Mutation, GraphQL'de veri oluşturma, güncelleme veya silme işlemlerini ifade eder. Örneğin, yeni bir kullanıcı ekleyen bir mutation şöyle tanımlanabilir:
// app/GraphQL/Mutation/CreateUserMutation.php
namespace App\GraphQL\Mutation;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Mutation;
use App\Models\User;
class CreateUserMutation extends Mutation
{
protected $attributes = [
'name' => 'createUser',
];
public function type(): Type
{
return \GraphQL::type('User');
}
public function args(): array
{
return [
'name' => ['name' => 'name', 'type' => Type::nonNull(Type::string())],
'email' => ['name' => 'email', 'type' => Type::nonNull(Type::string())],
];
}
public function resolve($root, $args)
{
return User::create([
'name' => $args['name'],
'email' => $args['email'],
]);
}
}
Bu mutation, name ve email parametrelerini alarak yeni bir kullanıcı oluşturur.
Gerçek Zamanlı Veri (Subscriptions)
GraphQL'in bir diğer güçlü yönü, gerçek zamanlı veri desteği sunmasıdır. Bu, örneğin bir kullanıcı yeni bir veri oluşturduğunda veya güncellediğinde istemcilerin anlık olarak bilgilendirilmesini sağlar. Laravel'de bu özelliği kullanmak için genellikle Laravel Echo ve Pusher gibi araçlar tercih edilir.
GraphQL'in Avantajları
- Esneklik: Sadece ihtiyaç duyulan alanları sorgulayarak API yanıtlarını optimize eder.
- Tek Noktadan Veri Erişimi: Farklı kaynaklardan veri almayı kolaylaştırır.
- Daha Az Veri Transferi: REST'e kıyasla daha verimli veri alışverişi sağlar.
Sonuç
GraphQL, modern API geliştirme süreçlerinde esnekliği ve verimliliği artırır. Laravel ile birlikte kullanıldığında, güçlü ve esnek API'ler geliştirmek mümkündür. Bu yazıda, temel kurulumdan başlayarak query ve mutation'ları nasıl oluşturacağınızı öğrendik. Gerçek zamanlı veri desteği ise daha ileri düzey bir konudur ve ihtiyaç duyulduğunda eklenebilir.
