Laravel’de JsonResource içerisinde ki objelerin bilindik türden veri tiplerine otomatik çevirilmesi

Oğuzhan KARACABAY
2 min readSep 14, 2022

--

Fotoğraf: Steven Rombauts

Ö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;

Order Model

OrderController ise büyük ihtimalle bu şekilde olacaktır;

OrderController

Son olarak OrderResource aşağıdaki şekilde olacaktır;

OrderResource

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;

OrderResource after package implementation

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

--

--

No responses yet