Tutorial Spatie Laravel Data: Data Object Modern untuk Laravel
Programming Tutorial Laravel Data Modeling #laravel #spatie #data #data-object

Tutorial Spatie Laravel Data: Data Object Modern untuk Laravel

A
Abd. Asis
4 min read
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:

Tentang Penulis

Abd. Asis

Abd. Asis

Software Developer dan Laravel Programmer dari Madura, Indonesia. Passionate tentang PHP, Laravel, dan teknologi web modern.

Komentar

Artikel Terkait

Artikel lain yang mungkin menarik untuk kamu