Salah satu ciri arsitektur Laravel yang baik: ketika sesuatu terjadi di aplikasi, komponen lain bisa “mendengarkan” dan merespons, tanpa si pengirim perlu tahu siapa yang merespons.
Itulah fungsi Event dan Listener di Laravel. Artikel ini menjelaskan cara kerjanya dan bagaimana implementasinya dengan contoh nyata.
Konsep Event dan Listener
Event adalah kejadian yang terjadi di aplikasi: user mendaftar, order diproses, pembayaran berhasil. Listener adalah kode yang merespons kejadian tersebut.
Satu event bisa punya beberapa listener. Misalnya saat UserRegistered:
- Listener 1: kirim email selamat datang
- Listener 2: create profil default
- Listener 3: sync ke CRM
Controller yang trigger event tidak perlu tahu ada 3 listener di belakang. Ini yang membuat kode lebih modular.
Membuat Event dan Listener
php artisan make:event UserRegistered
php artisan make:listener SendWelcomeEmail --event=UserRegistered
php artisan make:listener CreateDefaultProfile --event=UserRegistered
Kelas event (app/Events/UserRegistered.php):
<?php
namespace AppEvents;
use AppModelsUser;
use IlluminateFoundationEventsDispatchable;
use IlluminateQueueSerializesModels;
class UserRegistered
{
use Dispatchable, SerializesModels;
public function __construct(
public readonly User $user
) {}
}
Listener (app/Listeners/SendWelcomeEmail.php):
<?php
namespace AppListeners;
use AppEventsUserRegistered;
use AppMailWelcomeMail;
use IlluminateContractsQueueShouldQueue;
use IlluminateSupportFacadesMail;
class SendWelcomeEmail implements ShouldQueue
{
public function handle(UserRegistered $event): void
{
Mail::to($event->user)->send(new WelcomeMail($event->user));
}
}
Implement ShouldQueue agar listener dijalankan di background queue, tidak memperlambat proses registrasi.
Registrasi Event dan Listener
Di Laravel 12 (dan sejak Laravel 11), cukup tambahkan di app/Providers/AppServiceProvider.php:
<?php
namespace AppProviders;
use AppEventsUserRegistered;
use AppListenersSendWelcomeEmail;
use AppListenersCreateDefaultProfile;
use IlluminateSupportFacadesEvent;
use IlluminateSupportServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
Event::listen(UserRegistered::class, SendWelcomeEmail::class);
Event::listen(UserRegistered::class, CreateDefaultProfile::class);
}
}
Laravel juga mendukung auto-discovery. Kalau nama listener mengikuti konvensi, registrasi manual tidak diperlukan. Tapi registrasi manual lebih eksplisit dan lebih mudah di-trace.
Dispatch Event
// Di controller atau service
use AppEventsUserRegistered;
$user = User::create($validated);
UserRegistered::dispatch($user);
// Atau lewat helper
event(new UserRegistered($user));
Listener Synchronous vs Queued
Kalau listener implement ShouldQueue, dijalankan di background. Kalau tidak, dijalankan langsung (synchronous) sebelum response dikirim.
Kapan pakai synchronous:
- Listener yang hasilnya dibutuhkan sebelum response dikirim
- Operasi yang sangat cepat (kurang dari 10ms)
Kapan pakai queued:
- Kirim email, notifikasi, sync ke API eksternal
- Semua operasi yang tidak perlu hasilnya sekarang
Wildcard Listener
Kalau perlu listen ke banyak event sekaligus (misalnya untuk logging):
Event::listen('AppEvents*', function (string $eventName, array $data) {
Log::info("Event: {$eventName}", $data);
});
Baca Juga
- Apa Itu Observer di Laravel 12: Bedanya dengan Event Listener
- Notification di Laravel 12: Email, Database, dan Channel Kustom
Butuh tim untuk merancang arsitektur event-driven di aplikasi Laravel Anda? Lihat layanan pengembangan aplikasi kami.
Leave a Reply