laraveleventarchitectureMahir3 mnt baca

Event dan Listener

Decouple logika dengan event: dispatch saat sesuatu terjadi, listener yang mengerjakan sisanya.

Konsepnya

Event adalah "pengumuman" bahwa sesuatu terjadi ("PostDipublish"), listener adalah "pendengar" yang bereaksi (kirim email, update statistik, bersihkan cache). Controller cukup dispatch event, tidak perlu tahu ada berapa listener. Logika jadi terpisah dan gampang ditambah.

Membuat event dan listener

bash
php artisan make:event PostDipublish
php artisan make:listener KirimNotifikasiPelanggan --event=PostDipublish
php
// app/Events/PostDipublish.php
namespace App\Events;

use App\Models\Post;
use Illuminate\Foundation\Events\Dispatchable;

class PostDipublish
{
    use Dispatchable;

    public function __construct(public Post $post) {}
}
php
// app/Listeners/KirimNotifikasiPelanggan.php
namespace App\Listeners;

use App\Events\PostDipublish;
use Illuminate\Contracts\Queue\ShouldQueue;

class KirimNotifikasiPelanggan implements ShouldQueue
{
    public function handle(PostDipublish $event): void
    {
        // $event->post tersedia di sini
        // kirim notifikasi ke pelanggan...
    }
}

Dengan ShouldQueue, listener jalan di background via queue.

Mendaftarkan dan dispatch

Di Laravel 11+, daftarkan di AppServiceProvider:

php
// app/Providers/AppServiceProvider.php
use Illuminate\Support\Facades\Event;

public function boot(): void
{
    Event::listen(
        \App\Events\PostDipublish::class,
        \App\Listeners\KirimNotifikasiPelanggan::class,
    );
}

Dispatch dari mana saja:

php
// app/Http/Controllers/PostController.php
$post->update(['status' => 'published']);

PostDipublish::dispatch($post);

Satu event bisa punya banyak listener, dan menambah listener baru tidak mengubah kode controller sama sekali.

Observer: event bawaan model

Untuk event standar model (created, updated, deleted), pakai Observer yang lebih ringkas:

bash
php artisan make:observer PostObserver --model=Post
php
class PostObserver
{
    public function created(Post $post): void
    {
        // misal: bersihkan cache daftar post
    }

    public function deleted(Post $post): void
    {
        // misal: hapus file cover dari storage
    }
}

// Daftarkan di AppServiceProvider::boot()
Post::observe(PostObserver::class);

Catatan teknis: Hati-hati infinite loop: listener yang mengupdate model yang sama bisa memicu event lagi. Contoh: observer updated yang memanggil $post->update() akan memicu updated lagi tanpa henti. Untuk update diam-diam tanpa memicu event, pakai $post->updateQuietly() atau query builder langsung.