Events memisahkan "apa yang terjadi" dari "apa yang harus dilakukan" — loose coupling.
Contoh: Saat user register, kita ingin:
- Kirim email welcome
- Buat record di CRM
- Kirim notifikasi ke admin
Tanpa event (coupled):
public function register(Request $request) {
$user = User::create($request->all());
Mail::send(new WelcomeEmail($user)); // coupled!
CRM::createContact($user); // coupled!
Notification::send($admin, new NewUser($user)); // coupled!
}
Dengan event (decoupled):
// Event class
class UserRegistered {
public function __construct(public User $user) {}
}
// Listener classes
class SendWelcomeEmail {
public function handle(UserRegistered $event): void {
Mail::send(new WelcomeEmail($event->user));
}
}
class CreateCrmContact {
public function handle(UserRegistered $event): void {
CRM::createContact($event->user);
}
}
// Controller — hanya dispatch event
public function register(Request $request) {
$user = User::create($request->all());
event(new UserRegistered($user)); // Semua listener berjalan otomatis!
}
Keuntungan: Tambah listener baru tanpa mengubah controller. Setiap listener bisa di-queue untuk async.