Apa Itu Event dan Listener di Laravel 12: Arsitektur Event-Driven

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

Butuh tim untuk merancang arsitektur event-driven di aplikasi Laravel Anda? Lihat layanan pengembangan aplikasi kami.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *