LaravelNotificationMahir4 mnt baca

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

bash
php artisan make:notification KomentarDibalas
php
// 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:

php
// 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:

bash
php artisan notifications:table
php artisan migrate

Lalu tampilkan di halaman khusus:

php
// 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):

php
// 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 via Notification::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.