Programming Tutorial Laravel Data Modeling 27 July 2025

Tutorial Spatie Laravel Data: Data Object Modern untuk Laravel

Tutorial Spatie Laravel Data: Data Object Modern untuk Laravel
Bagikan:

Pernah merasa bingung saat harus mengelola data yang kompleks di aplikasi Laravel? Misal, data dari API, form, atau response yang butuh diubah-ubah sebelum dipakai? Nah, package Spatie Laravel Data hadir untuk memudahkan kamu membuat data object yang rapi, aman, dan mudah di-maintain. Artikel ini akan membimbing kamu step-by-step dari konsep dasar sampai implementasi nyata, lengkap dengan tips, analogi, dan solusi error yang sering ditemui pemula.

Yuk, kita mulai petualangan data modeling di Laravel!

Data Object: Kenapa Penting?

Bayangkan kamu punya aplikasi toko online. Setiap produk punya banyak atribut: nama, harga, stok, gambar, kategori, dan lain-lain. Kalau semua data ini di-handle langsung di controller atau view, kode jadi cepat berantakan. Dengan data object, kamu bisa membungkus data dalam satu class yang jelas strukturnya, gampang diubah, dan aman dari typo.

Persiapan: Instalasi & Setup

  1. Install package
composer require spatie/laravel-data
  1. (Opsional) Publish config
php artisan vendor:publish --provider="Spatie\LaravelData\LaravelDataServiceProvider" --tag="config"
  1. Buat folder Data

Biasanya di app/Data. Semua data object kamu simpan di sini.

Konsep Dasar: Membuat Data Object Pertama

Misal kamu ingin membungkus data produk:

// app/Data/ProductData.php
use Spatie\LaravelData\Data;

class ProductData extends Data
{
    public function __construct(
        public string $name,
        public int $price,
        public ?string $image = null,
    ) {}
}

Sekarang, kamu bisa membuat object dari array, model, atau request:

$product = Product::find(1);
$data = ProductData::from($product);

Transformasi Data: Output yang Rapi

Data object bisa diubah ke array/JSON dengan mudah:

return ProductData::from($product)->toArray();
// atau
return ProductData::from($product)->toJson();

Kamu juga bisa filter property yang ingin ditampilkan:

ProductData::from($product)->only('name', 'price');
ProductData::from($product)->except('image');

Nesting & Collection: Data Bersarang

Kalau produk punya relasi, misal kategori:

// app/Data/CategoryData.php
class CategoryData extends Data
{
    public function __construct(
        public string $name,
    ) {}
}

// app/Data/ProductData.php
class ProductData extends Data
{
    public function __construct(
        public string $name,
        public int $price,
        public ?string $image = null,
        public CategoryData $category,
    ) {}
}

Untuk collection (banyak data):

$products = Product::all();
ProductData::collect($products); // array of ProductData

Lazy Properties: Data Besar, Output Ringan

Kadang kamu nggak mau semua relasi langsung di-load. Pakai Lazy:

use Spatie\LaravelData\Lazy;

class ProductData extends Data
{
    public function __construct(
        public string $name,
        public int $price,
        public Lazy|CategoryData $category,
    ) {}

    public static function fromModel(Product $product): self
    {
        return new self(
            $product->name,
            $product->price,
            Lazy::create(fn() => CategoryData::from($product->category))
        );
    }
}

Validasi Otomatis: Data Lebih Aman

Kamu bisa tambahkan validasi langsung di data object:

use Spatie\LaravelData\Attributes\Validation\Min;

class ProductData extends Data
{
    public function __construct(
        #[Min(1)]
        public int $price,
        public string $name,
    ) {}
}

Saat data di-create, validasi otomatis jalan. Kalau error, langsung dapat pesan validasi.

Mapping Property: Nama Field Berbeda

Kadang nama di database beda dengan API. Bisa mapping pakai attribute:

use Spatie\LaravelData\Attributes\MapName;

class ProductData extends Data
{
    public function __construct(
        #[MapName('product_name')]
        public string $name,
        public int $price,
    ) {}
}

Integrasi dengan Livewire & Inertia

Data object bisa dipakai di Livewire dan Inertia untuk binding data yang lebih rapi dan aman. Cek dokumentasi resmi untuk contoh lengkap.

Tips & Best Practice

  • Pisahkan data object untuk setiap resource utama.
  • Gunakan Lazy untuk relasi besar atau berat.
  • Selalu test validasi di data object, bukan hanya di request.
  • Manfaatkan fitur mapping untuk API/database yang beda struktur.
  • Jalankan php artisan data:cache-structures setelah menambah data object baru untuk performa optimal.
  • Gunakan collection type (DataCollection) jika butuh fitur mirip Laravel Collection.
  • Cek breaking changes di UPGRADING.md saat update versi.

Troubleshooting Error Umum

  • Error validasi: Pastikan attribute validasi sudah benar dan payload sesuai tipe data.
  • Property tidak muncul di output: Cek apakah property di-exclude atau belum di-include.
  • Error saat mapping: Pastikan nama field di attribute MapName sesuai dengan sumber data.
  • Performance lambat: Jalankan php artisan data:cache-structures dan gunakan Lazy untuk relasi besar.

Penutup: Data Modeling Lebih Mudah & Aman

Dengan Spatie Laravel Data, kamu bisa bikin aplikasi Laravel yang lebih rapi, scalable, dan mudah di-maintain. Data object bikin proses transformasi, validasi, dan integrasi jadi jauh lebih simpel. Jangan ragu eksplorasi fitur lanjutan seperti custom transformer, lazy property, dan integrasi dengan Livewire/Inertia. Selamat mencoba!


Referensi Lanjutan: