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
- Install package
composer require spatie/laravel-data
- (Opsional) Publish config
php artisan vendor:publish --provider="Spatie\LaravelData\LaravelDataServiceProvider" --tag="config"
- 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: