Laravel Events Jobs Listeners Decision When To Use
Definisi
Ketiganya sering bingung karena sama-sama "reaksi terhadap sesuatu", tapi perannya beda:
- Event: fakta bahwa "sesuatu terjadi" (misal
UserRegistered). Event tidak melakukan kerja, hanya mengumumkan. - Listener: penangan satu event. Bisa sinkron (langsung jalan) atau di-queue (jadi job di belakang).
- Job: unit kerja yang dijalankan secara async oleh worker, bisa di-retry. Job biasanya dipanggil dari listener atau langsung di-dispatch.
Kapan dipakai
- Event + Listener: saat satu aksi memicu banyak efek samping yang boleh berkembang tanpa mengubah kode pemanggil (observer pattern).
UserRegistered→ kirim email, buat profile, notify admin. - Job: saat pekerjaannya lambat/berat dan harus lepas dari request (resize gambar, panggil API pihak ketiga, kirim notifikasi massal).
- Listener di-queue: saat reaksi event memang berat, sehingga event dipancarkan cepat lalu listener jalan di background.
Cara kerja
Event & listener
// app/Events/UserRegistered.php
class UserRegistered {
use SerializesModels;
public function __construct(public User $user) {}
}
// app/Listeners/SendWelcomeEmail.php
class SendWelcomeEmail {
public function handle(UserRegistered $event): void {
Mail::to($event->user)->send(new Welcome());
}
}Daftarkan di EventServiceProvider:
protected $listen = [
UserRegistered::class => [SendWelcomeEmail::class],
];Listener jadi queue
class SendWelcomeEmail implements ShouldQueue {
public function handle(UserRegistered $event): void { /* ... */ }
}Sekarang event dispatch tidak menunggu email selesai.
Job langsung
dispatch(new ExportReport($user)); // jalan di worker backgroundStruktur alur
Loading diagram...
Contoh kombinasi
event(new UserRegistered($user)); // cepat, kembalikan response
// di background: listener kirim email + job export dataCatatan implementasi
- Event bagus untuk decoupling: pemanggil tidak perlu tahu siapa yang bereaksi.
- Kalau reaksi harus dijamin selesai sebelum response (misal audit log kritis), jangan queue listener-nya.
- Job yang dipanggil dari listener tetap punya retry/timeout seperti job biasa.
Kesalahan umum
- Event dipakai untuk logika wajib sinkron: kalau hasilnya harus ada sebelum response, jangan andalkan listener async.
- Over-observing: terlalu banyak listener kecil membuat alur sulit dilacak; kadang langsung method lebih jelas.
- Listener berat tanpa queue: memperlambat request utama.
- Mencampur tanggung jawab: job melakukan hal yang bukan pekerjaan (sebaiknya job fokus satu tugas, event hanya mengumumkan).