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
php artisan make:event PostDipublish
php artisan make:listener KirimNotifikasiPelanggan --event=PostDipublish// 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) {}
}// 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:
// 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:
// 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:
php artisan make:observer PostObserver --model=Postclass 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
updatedyang memanggil$post->update()akan memicuupdatedlagi tanpa henti. Untuk update diam-diam tanpa memicu event, pakai$post->updateQuietly()atau query builder langsung.