Pernah nggak kamu nulis fungsi yang ngelakuin seabrek hal sekaligus — kirim email, update database, catat log, dan notifikasi user — semua dalam satu blok kode yang panjangnya sampai bikin scroll jari keriting? Kalau iya, berarti kamu lagi mengalami masalah klasik yang disebut tight coupling, dan di sinilah sistem Event & Listener di Laravel hadir sebagai penyelamat. Di artikel ke-30 dari 50 seri Belajar Laravel Lengkap ini, kita akan kupas tuntas bagaimana arsitektur berbasis event bisa membuat kode kamu jauh lebih bersih, modular, dan mudah dikembangkan — tanpa pusing mikirin siapa yang harus ngerjain apa.
๐ญ Analogi Nyata: Konser Musik & Sistem Siaran Radio
Bayangkan kamu adalah seorang DJ radio. Ketika kamu bilang "Pendengar, ini lagu terbaru dari Tulus!", kamu nggak tahu siapa yang lagi dengerin — mungkin ada yang langsung nge-share ke story, ada yang langsung download, ada yang bilang ke temennya. Kamu cukup broadcast satu pesan, dan semua orang yang "tune in" akan bereaksi sesuai caranya masing-masing.
Nah, itulah persis cara kerja Event & Listener di Laravel. Bagian kode yang "memanggil" suatu aksi (misalnya: user berhasil daftar) disebut Event. Sedangkan kode yang "bereaksi" atas kejadian itu disebut Listener. Yang indah? Bagian yang men-trigger event nggak perlu tahu sama sekali siapa yang bakalan dengerin.
Event & Listener menerapkan prinsip Open/Closed Principle dari SOLID — kode terbuka untuk ekstensi (tambah listener baru) tapi tertutup untuk modifikasi. Kamu bisa tambah fitur baru tanpa menyentuh kode lama sama sekali!
Dalam konteks Laravel, misalnya kamu punya event UserRegistered. Dari satu event ini, kamu bisa punya tiga listener berbeda: satu untuk kirim email sambutan, satu untuk create profil default, dan satu untuk notifikasi ke admin — semuanya berjalan otomatis tanpa satu sama lain saling memanggil.
๐ ️ Cara Membuat Event & Listener di Laravel
Laravel membuat pembuatan event dan listener jadi sangat mudah dengan Artisan CLI. Berikut panduan lengkap step-by-step dari nol sampai event kamu bisa berjalan:
Daftarkan Event & Listener di EventServiceProvider
Buka file app/Providers/EventServiceProvider.php dan daftarkan pasangan event-listener di properti $listen.
protected $listen = [ UserRegistered::class => [ SendWelcomeEmail::class, CreateUserProfile::class, NotifyAdminNewUser::class, ], ];
Generate Event & Listener dengan Artisan
Setelah mendaftar di EventServiceProvider, jalankan command berikut untuk generate file-nya secara otomatis:
$ php artisan event:generate # Atau generate satu per satu: $ php artisan make:event UserRegistered $ php artisan make:listener SendWelcomeEmail --event=UserRegistered
Definisikan Class Event
File event ada di app/Events/UserRegistered.php. Event hanya bertugas membawa data, bukan memproses logika:
namespace App\Events; use App\Models\User; class UserRegistered { public $user; public function __construct(User $user) { $this->user = $user; } }
Tulis Logika di Class Listener
File listener ada di app/Listeners/SendWelcomeEmail.php. Di sinilah semua logika reaksi ditulis:
namespace App\Listeners; use App\Events\UserRegistered; use Illuminate\Support\Facades\Mail; use App\Mail\WelcomeMail; class SendWelcomeEmail { public function handle(UserRegistered $event) { Mail::to($event->user->email) ->send(new WelcomeMail($event->user)); } }
Dispatch (Tembak) Event dari Controller
Terakhir, panggil event dari controller atau model. Gunakan helper event() atau facade Event::dispatch():
use App\Events\UserRegistered; public function store(Request $request) { $user = User::create($request->validated()); // Cukup dispatch event — listener akan jalan otomatis! event(new UserRegistered($user)); return redirect()->route('dashboard'); }
Kamu juga bisa auto-discover event tanpa mendaftar manual! Set $shouldDiscoverEvents = true di EventServiceProvider, dan Laravel akan otomatis scan semua file di folder Events & Listeners. Cocok untuk proyek yang terus berkembang.
๐ Perbandingan: Kode Tanpa vs Dengan Event & Listener
Supaya kamu makin yakin kenapa Event & Listener itu penting, lihat perbandingan berikut. Ini contoh nyata bagaimana controller bisa berubah dari "monster" jadi "bersih":
Laravel sendiri menggunakan sistem event secara internal! Misalnya Illuminate\Auth\Events\Login, Illuminate\Auth\Events\Registered, dan banyak lagi. Kamu bisa listen ke event-event bawaan Laravel ini tanpa perlu mengubah apapun di core framework.
⚡ Fitur Lanjutan: Queued Listener & Event Discovery
Sistem event di Laravel bukan sekadar notify-notify biasa. Ada dua fitur lanjutan yang bakal sering kamu pakai di proyek nyata:
๐ 1. Queued Listener — Proses di Background
Kalau listener kamu perlu waktu lama (kirim email, generate laporan, upload ke cloud), kamu bisa jalankan dia secara asynchronous dengan mengimplementasikan interface ShouldQueue:
use Illuminate\Contracts\Queue\ShouldQueue; class SendWelcomeEmail implements ShouldQueue { // Listener ini akan masuk ke queue, tidak blocking response public $queue = 'emails'; // nama queue spesifik (opsional) public $delay = 60; // delay 60 detik sebelum diproses (opsional) public function handle(UserRegistered $event) { Mail::to($event->user->email) ->send(new WelcomeMail($event->user)); } }
๐ 2. Event Discovery Otomatis
Capek mendaftar event satu per satu? Aktifkan auto-discovery dan Laravel akan mendeteksinya sendiri berdasarkan type-hint di method handle() pada setiap listener:
// Aktifkan ini, dan hapus array $listen public function shouldDiscoverEvents(): bool { return true; }
Jangan lupa jalankan php artisan event:cache di production untuk performa optimal. Ini akan cache semua registrasi event sehingga Laravel tidak perlu scan file setiap request. Dan pastikan jalankan php artisan event:clear setelah kamu menambah event baru.
๐งช Testing Event & Listener di Laravel
Salah satu keuntungan terbesar sistem event adalah kemudahan testing. Laravel menyediakan fake untuk event sehingga kamu bisa verifikasi event dispatched tanpa benar-benar menjalankan listener-nya:
use Illuminate\Support\Facades\Event; use App\Events\UserRegistered; public function test_user_registration_fires_event() { // Fake event — listener tidak akan benar-benar jalan Event::fake(); // Lakukan aksi register user $this->post('/register', [ 'name' => 'Budi Santoso', 'email' => 'budi@example.com', ]); // Assert bahwa event benar-benar di-dispatch Event::assertDispatched(UserRegistered::class); }
Gunakan Event::assertDispatched(UserRegistered::class, function($event) { ... }) untuk verifikasi data spesifik yang dibawa event — misalnya memastikan bahwa user yang di-pass ke event memang user yang benar. Ini jauh lebih reliable daripada sekadar cek apakah event terjadi.
TOPIK TERKAIT:
๐ NAVIGASI SERI — 50 ARTIKEL BELAJAR LARAVEL LENGKAP
No comments:
Post a Comment