Laravel’de Data Transfer Objects Kullanımı

Yazılım geliştirmesi yapılan bir projede iş mantığı çok karmaşık olmasa da veri kullanımı ve transferi çok karmaşıklaşabiliyor. Böyle durumlar için alacağımız önlemlerden biri de veri transfer nesneleri (DTO) kullanmak olabilir.

veri transfer nesneleri – data transfer objects – dto

DTO’lar basit veri kapsayıcı – taşıyıcı sınıflardır. İçlerinde veriyi değiştirmeye manipüle etmeye yarayan mantık bulunmaz fakat doğrulama ya da düzenleme yapılabilir. İki farklı katman ya da bileşen-component arasındaki veri transferini sağlarken bize güvenli bir yol sunabilir. Bu katmanlara örnek dış bir API isteği sonucu ile veri tabanımız olabilir.

Faydaları

  • Kaynağını kontrol edemediğimiz verileri kullanırken DTO ile verimizden emin olabiliriz, karmaşıklığı azaltır.
  • Sadece gerekli alanları DTO sınıfına vereceğimiz için bazı durumlarda veri transferinde performans açısından faydalı olabilir.
  • Aynı şekilde kontrolü tamamen bize verdiği için veri güvenliğine de katkısı olabilir. Hassas verileri maskelememizi ya da saklamamızı sağlar
  • Özellikle API geliştirilmesi gerektiği durumlarda gelen-giden veri tiplerini kontrolde tutar, versiyon değişikliklerinde değişebilecek veri tipleri kontrol edebilmemizi sağlar.

Bir Örnek ile İlerleyelim

Bir bölgenin belirli bir gün için saatlik rüzgar verisine ihtiyacımız olduğunu varsayalım, bunun için openweathermap.org APIsi bize uygun fakat aşağıda örnek bir istek cevabını veriyorum. Kullanmayacağımız onlarca veri var ve ihtiyacımız olan veri de derinlerde bir yerde.

{
   "lat":33.44,
   "lon":-94.04,
   "timezone":"America/Chicago",
   "timezone_offset":-18000,
   "current":{
      "dt":1684929490,
      "sunrise":1684926645,
      "sunset":1684977332,
      "temp":292.55,
      "feels_like":292.87,
      "pressure":1014,
      "humidity":89,
      "dew_point":290.69,
      "uvi":0.16,
      "clouds":53,
      "visibility":10000,
      "wind_speed":3.13,
      "wind_deg":93,
      "wind_gust":6.71,
      "weather":[
         {
            "id":803,
            "main":"Clouds",
            "description":"broken clouds",
            "icon":"04d"
         }
      ]
   },
   "minutely":[
      {
         "dt":1684929540,
         "precipitation":0
      },
      ...
   ],
   "hourly":[
      {
         "dt":1684926000,
         "temp":292.01,
         "feels_like":292.33,
         "pressure":1014,
         "humidity":91,
         "dew_point":290.51,
         "uvi":0,
         "clouds":54,
         "visibility":10000,
         "wind_speed":2.58, // sadece bu 3 alana ihtiyacımız var
         "wind_deg":86, // sadece bu 3 alana ihtiyacımız var
         "wind_gust":5.88, // sadece bu 3 alana ihtiyacımız var
         "weather":[
            {
               "id":803,
               "main":"Clouds",
               "description":"broken clouds",
               "icon":"04n"
            }
         ],
         "pop":0.15
      },
      ...
   ],
   "daily":[
      {
         "dt":1684951200,
         "sunrise":1684926645,
         "sunset":1684977332,
         "moonrise":1684941060,
         "moonset":1684905480,
         "moon_phase":0.16,
         "summary":"Expect a day of partly cloudy with rain",
         "temp":{
            "day":299.03,
            "min":290.69,
            "max":300.35,
            "night":291.45,
            "eve":297.51,
            "morn":292.55
         },
         "feels_like":{
            "day":299.21,
            "night":291.37,
            "eve":297.86,
            "morn":292.87
         },
         "pressure":1016,
         "humidity":59,
         "dew_point":290.48,
         "wind_speed":3.98,
         "wind_deg":76,
         "wind_gust":8.92,
         "weather":[
            {
               "id":500,
               "main":"Rain",
               "description":"light rain",
               "icon":"10d"
            }
         ],
         "clouds":92,
         "pop":0.47,
         "rain":0.15,
         "uvi":9.23
      },
      ...
   ],
    "alerts": [
    {
      "sender_name": "NWS Philadelphia - Mount Holly",
      "event": "Small Craft Advisory",
      "start": 1684952747,
      "end": 1684988747,
      "description": "....",
      "tags": [

      ]
    },
    ...
  ]

JSON formatındaki bu response değerini alan ve gerekli alanları kullanan bir DTO sınıfı oluşturalım. Bu dosyamızı app klasörü altında DTO adında bir klasör açarak içine kaydedebiliriz. PSR-4 standartlarına da uygun olarak composer autoload sınıfımızı gerekli yerde bularak import edebilecektir.

namespace App\DTO;

class WindDTO
{
  public array $hourly;
  
  public function __construct(array $response)
  {
    foreach($response['hourly'] as $hourly) {
    	$hour = $this->dtToHour($hourly['dt']); 
      	
      	$this->hourly[$hour] = [
        	'speed' => $hourly['wind_speed'],
        	'degree' => $hourly['wind_deg'],
        	'gust' => $hourly['wind_gust'],
        ]
    }
  }
  
  private function dtToHour(int $dt): int
  {
    // unixtime'dan günün hangi saati olduğunu bul ve dön
  }
}

Bu şekilde istek yaptıktan sonra veri düzenleme ayıklama görevini de farklı bir katmana vermiş oluyoruz.


Yayımlandı

kategorisi

yazarı:

Etiketler:

Yorumlar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir