Laravel’de JsonResource içerisinde ki objelerin bilindik türden veri tiplerine otomatik çevirilmesi
Öncelikle problemi açıklayarak başlayalım; Farz edelim ki siparişlerimizi yönetmek amacıyla, Order adlı bir Eloquent modelimiz mevcut ve modelimizde price
ve product_name
olarak 2 adet kolonumuz var, price
kolonu ise Money
object olarak cast edilmiş durumda.
Order
Eloquent modelimiz şu şekilde olacaktır;
OrderController
ise büyük ihtimalle bu şekilde olacaktır;
Son olarak OrderResource
aşağıdaki şekilde olacaktır;
Eğer bu modele ait herhangi bir objeyi yukarıdaki controlleri kullanarak görüntülemek istersek aşağıda ki gibi bir JSON çıktısı elde ederiz;
Görebileceğiniz gibi price
kolonu normalde dolu olmasına rağmen Money
objesine cast edildiği için boş olarak gözükmekte, Bu problemi çözebilmek Money
objesini kullanan tüm resource’larda bu objeyi integer’e yada float’a çevirmemiz gerekmektedir.
Bizim Uyguladığımız Çözüm
Tek yapmamız gereken şey AutoCastingJsonResource
traitini JsonResource
class’ımız içerisine eklemek ve casts
methodunu ezmek;
Yukarıda ki şekilde AutoCastingJsonResource
trait’imizi JsonResource
içerisine import edip, casts
abstract array’imizi tanımlayarak istediğimiz objeleri istediğimiz şekilde cast edebiliyoruz, modelin içerisindeki tüm objeler ve arrayler taranarak belirtilen Money
objesi bulunduğunda bu objeye tanımlı closure
çalıştırılıp dönen değer ilgili objeye yeni bir değer olarak atanır, böylelikle aşağıda ki gibi bir sonuç alabiliriz;
Görüldüğü üzere Money
objemiz otomatik olarak integer’e çevirildi.
Tüm Resourcelar İçin Uygulanabilecek Çözüm
Eğer dikkat ettiyseniz, tüm resourcelarda otomatik olarak bir dönüşüm uygulamadık, sisteme her yeni bir resource dosyası oluşturduğumuzda trait’i eklemek ve casts
abstract fonksiyonunu düzenlememiz gerekecek, bu sorunu çözebilmek içinse bir BaseJsonResource
tanımlayıp yeni oluşturacağımız tüm JsonResourceler’i bu class’tan extend edebiliriz;
Şimdi oluşturduğumuz herhangi bir resource’yi bu classtan extend edebiliriz;
BaseJsonResource
extend ettikten sonra her şey sorunsuz bir şekilde çalışıyor olmalı;
Bu makale Oğuzhan Karacabay, Yunus Emre Deligöz tarafından beraber yazılmıştır ve hem İngilizce hem de Türkçe dillerinde okunabilir.
AutoCastingJsonResource paketi için Github link: https://github.com/oguzhankrcb/auto-casting-json-resource