Notification Channels dan On-Demand Laravel
Definisi
Notification di Laravel adalah kelas yang mendeskripsikan pesan lewat berbagai channel (mail, database, broadcast, slack, dll). On-demand notification memungkinkan mengirim ke siapa saja (email/telepon) tanpa model Notifiable, cukup lewat Notification::route('mail', 'user@x.com').
Kapan dipakai
- Channels: saat satu event harus kabarkan lewat banyak saluran (email + DB inbox + Slack).
- On-demand: kirim ke alamat sekali pakai (form "kirim ke email ini") tanpa punya user terdaftar.
- Database channel: inbox notifikasi in-app yang bisa ditandai dibaca.
- Hindari menaruh logika pengiriman di controller; buat Notification class.
Cara kerja
Notification class
class InvoicePaid extends Notification
{
public function via($notifiable)
{
return ['mail', 'database'];
}
public function toMail($notifiable)
{
return (new MailMessage)->subject('Lunas')->line('Invoice lunas');
}
public function toArray($notifiable)
{
return ['invoice_id' => $this->invoice->id];
}
}Kirim ke user
$user->notify(new InvoicePaid($invoice));On-demand
Notification::route('mail', 'guest@x.com')
->route('slack', env('SLACK_WEBHOOK'))
->notify(new InvoicePaid($invoice));Database inbox
// tandai dibaca
$user->unreadNotifications->markAsRead();Struktur alur
Loading diagram...
Contoh channel kustom
public function via($notifiable)
{
return [WhatsappChannel::class];
}
public function toWhatsapp($notifiable) { /* return message */ }Catatan implementasi
via()bisa return array dinamis berdasar preferensi user (cek$notifiable->notify_via).- Database channel butuh migration
notifications(bawaanphp artisan notifications:table). - On-demand butuh object/array yang punya method channel (Laravel sediakan
AnonymousNotifiable). - Untuk broadcast, butuh
ShouldBroadcast+ Pusher/Echo (lihat Broadcasting).
Kesalahan umum
- Logika di controller: notifikasi sulit di-test & reuse.
- Lupa migrasi notifications: channel database error table missing.
- via() hardcode semua: user mau email malah ke-Slack juga.
- On-demand tanpa route valid: notifikasi hilang diam-diam.