Notification: Multi-Channel Sekaligus
Kirim notifikasi via mail, database, dan WhatsApp-style channel.
Notification vs Mail: Kapan Pakai yang Mana
Ini pertanyaan yang sering bikin bingung. Sederhananya: Mail untuk mengirim dokumen/informasi sekali jalan (invoice, struk, laporan PDF). Notification untuk memberi tahu user bahwa sesuatu terjadi pada akunnya (komentarmu dibalas, pesananmu dikirim, ada login dari perangkat baru). Bedanya, notification dirancang multi-channel sejak awal: email + database + SMS + WhatsApp bisa dikirim dari satu class, dan channel database mencatat riwayatnya sehingga user bisa melihat lonceng notifikasi di aplikasi.
Struktur Notification Lengkap
php artisan make:notification KomentarDibalas// app/Notifications/KomentarDibalas.php
namespace App\Notifications;
use App\Models\Komentar;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class KomentarDibalas extends Notification implements ShouldQueue
{
use Queueable;
public function __construct(public Komentar $komentar) {}
public function via(object $notifiable): array
{
// kirim lewat email DAN simpan ke database
return ['mail', 'database'];
}
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->subject('Komentarmu dibalas!')
->line($this->komentar->penulis->name.' membalas komentarmu.')
->action('Lihat Balasan', url('/posts/'.$this->komentar->post_id))
->line('Terima kasih sudah aktif berdiskusi!');
}
public function toArray(object $notifiable): array
{
// data minimal untuk channel database
return [
'komentar_id' => $this->komentar->id,
'post_id' => $this->komentar->post_id,
'pembalas' => $this->komentar->penulis->name,
];
}
}Mengirimnya:
// ke satu user
$post->user->notify(new KomentarDibalas($komentar));
// ke banyak user sekaligus
use Illuminate\Support\Facades\Notification;
Notification::send($subscribers, new KomentarDibalas($komentar));Channel Database: Lonceng Notifikasi
Channel database menyimpan notifikasi ke tabel notifications. Siapkan dulu:
php artisan notifications:table
php artisan migrateLalu tampilkan di halaman khusus:
// app/Http/Controllers/NotifikasiController.php
namespace App\Http\Controllers;
class NotifikasiController extends Controller
{
public function index()
{
$notifikasi = auth()->user()
->notifications() // relasi bawaan Notifiable
->paginate(15);
return view('notifikasi.index', compact('notifikasi'));
}
public function baca($id)
{
$notif = auth()->user()->notifications()->findOrFail($id);
$notif->markAsRead();
return redirect($notif->data['url'] ?? '/notifikasi');
}
}Di Blade, $notif->data['pembalas'] membaca array dari toArray(), dan $notif->read_at null berarti belum dibaca. Simpel tapi powerful: inilah fondasi fitur lonceng notifikasi di hampir semua aplikasi.
Channel Custom: Contoh WhatsApp
Butuh channel di luar bawaan? Buat class channel sendiri. Laravel memanggil method send($notifiable, $notification):
// app/Notifications/Channels/WhatsAppChannel.php
namespace App\Notifications\Channels;
class WhatsAppChannel
{
public function send(object $notifiable, $notification): void
{
$pesan = $notification->toWhatsApp($notifiable);
// panggil API gateway WA di sini
app(\App\Services\WhatsAppGateway::class)->kirim(
$notifiable->no_wa,
$pesan
);
}
}Di notification, tambahkan 'whatsapp' ke via() dan method toWhatsApp() yang mengembalikan string pesan. Pola ini sama untuk Telegram, Slack, atau push notification.
Jebakan Umum
Notification berat tanpa queue. Kalau via() mengembalikan ['mail', 'database', 'whatsapp'] dan dikirim sinkron, request user menunggu tiga API eksternal. Implementasikan ShouldQueue seperti contoh di atas agar semuanya jalan di background.
Menyimpan data berlebihan di toArray(). Channel database menyimpan JSON. Jangan simpan seluruh model atau HTML panjang, cukup ID dan teks ringkas. Data detail di-fetch saat ditampilkan.
Lupa Notifiable trait. Model User bawaan Laravel sudah punya use Notifiable, tapi kalau kamu kirim notifikasi ke model lain (misal Team), pastikan trait-nya dipasang, kalau tidak method notify() tidak ada.
Catatan teknis: Ada juga
Notification::sendNow()untuk pengiriman sinkron paksa, dan on-demand notification viaNotification::route('mail', '[email protected]')->notify(...)untuk mengirim ke alamat yang bukan model User. Berguna untuk notifikasi ke admin yang datanya cuma ada di config.
Tantangan
Notifikasi Komentar
Buat notification NewComment (mail + database) yang dikirim ke penulis post saat ada komentar baru. Tampilkan notifikasi database di halaman /notifikasi.