Pernahkah kamu perlu menjalankan kode tertentu setiap kali sebuah model disimpan, diperbarui, atau dihapus? Misalnya, membuat log aktivitas otomatis, mengirim notifikasi, atau membersihkan cache. Cara naif adalah menulisnya di setiap controller, tapi ini melanggar prinsip DRY (Don't Repeat Yourself). Solusinya adalah Model Observer — sebuah kelas yang "mengawasi" lifecycle event Eloquent dan bereaksi secara otomatis.
Apa itu Eloquent Events?
Eloquent memicu event-event berikut selama lifecycle sebuah model:
-
creating/created— sebelum dan sesudah INSERT. -
updating/updated— sebelum dan sesudah UPDATE. -
saving/saved— sebelum dan sesudah CREATE atau UPDATE. -
deleting/deleted— sebelum dan sesudah DELETE. -
restoring/restored— untuk soft delete, sebelum dan sesudah restore. -
retrieved— setelah model diambil dari database.
Membuat Observer
Buat observer menggunakan Artisan:
php artisan make:observer ProductObserver --model=Product
File akan dibuat di app/Observers/ProductObserver.php:
<?php
namespace App\Observers;
use App\Models\Product;
use Illuminate\Support\Facades\Log;
class ProductObserver
{
public function creating(Product $product): void
{
// Otomatis isi slug sebelum disimpan
if (empty($product->slug)) {
$product->slug = \Str::slug($product->name);
}
}
public function created(Product $product): void
{
Log::info("Produk baru dibuat: {$product->name} (ID: {$product->id})");
}
public function updating(Product $product): void
{
// Update slug jika nama berubah
if ($product->isDirty('name')) {
$product->slug = \Str::slug($product->name);
}
}
public function updated(Product $product): void
{
// Bersihkan cache terkait produk ini
cache()->forget("product_{$product->id}");
Log::info("Produk diperbarui: {$product->name}");
}
public function deleting(Product $product): void
{
// Hapus semua gambar terkait sebelum produk dihapus
foreach ($product->images as $image) {
\Storage::disk('public')->delete($image->path);
$image->delete();
}
}
public function deleted(Product $product): void
{
Log::warning("Produk dihapus: {$product->name} (ID: {$product->id})");
}
}
Artikel ini ditampilkan sebagian. Untuk pembahasan selengkapnya, beserta contoh dan langkah detailnya, Anda dapat membacanya pada sumber aslinya:
Cara Menggunakan Model Observer di Laravel
Tutorial pemrograman dan tools developer lainnya juga tersedia di dhiecoderweb.com.
Top comments (0)