DEV Community

Dhiecoderweb
Dhiecoderweb

Posted on • Originally published at dhiecoderweb.com

Cara Menggunakan Model Observer di Laravel

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
Enter fullscreen mode Exit fullscreen mode

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})");
    }
}
Enter fullscreen mode Exit fullscreen mode

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)