Laravel Lighthouse ile Dinamik Olarak Veri Üretmek

Lighthouse'u temelde modellerde CRUD işlemleri yapmak için kullanıyoruz fakat kimi durumlarda kendi özel tiplerimizi belirleyip bunun için mutasyon veya query yazarak bunları doldurabilmekteyiz.

Aşağıda basit bir örneğini verdiğim şekilde özel tip ve bu özel tipin query yapısı gözüküyor. Normalde bu veriyi olduğu gibi aktarmak ve gelen isteğe göre Lighthouse'un bu dizi içinden istediğini almasını bekleyebiliriz. Fakat burada örneğini verdiğim gibi hesaplaması pahalı bir veriyse oluşturmamız gereken.

type Query {
  stat: Stat!
}

type Stat {
  userCount: Int
  expensiveStat: Int
}
schema.graphql
<?php
public function __invoke($_, $args)
{
  return [
    userCount: User::count(),
    expensiveStat: calculateExpensiveStat()
  ]
}
app/Graphql/Query/Stat.php

Eğer bu bir model olsaydı model attribute veya modele eklenen bir metod yardımıyla erişim isteğine göre bu veri üretilirdi fakat bizim oluşturdumuz Query handler hangi alanların çekildiği bilgisine sahip değil.

Bunun yerine biz bu hesaplamalar için Closure oluşturabiliriz. Sonuç olarak Lighthouse sadece istenilen alanlarda olan fonksiyonları çalıştıracak ve bizim ekstra pahalı işlemimiz istenilmediği sürece kullanılmayacak.

Aşağıda belirttiğim gibi bir yapı sayesinde istemci expensiveStat değerini istediği durumda hesaplanacak başka hiç bir durumda hesaplanmayaktır.

<?php
public function __invoke($_, $args)
{
  return [
    "userCount" =>  User::count(),
    "expensiveStat" => function () {
        return calculateExpensiveStat();
    }
  ]
}
app/Graphql/Query/Stat.php

197 kelime

2021-04-20